通过索引访问可变参数模板中的类型
Access a type in a variadic template by index
我想通过索引获取可变参数模板中的类型。索引被指定为模板参数。
我设法找到了一个可行的 'hack',但我认为它不符合可变参数模板编程的精神。此外,它使用额外的内存。
这是带有一些解释的代码:
template <typename... InputPortTypes>
class PipelineReceiver
{
protected:
// This tuple is used for storing types only
// Hence, I would like to get rid of it, but I am not sure how.
std::tuple<
std::function<std::unique_ptr<InputPortTypes> (int)>...
> InputPortsTuple;
// This vector is used for storing the actual objects
// This is needed to be able to access/change its elements
// during run time later on.
// The vector is used for storage of function pointers (i.e. of type std::function)
// that represent methods of another object upstream the pipeline.
std::vector<boost::any> InputPortsVector;
public:
PipelineReceiver()
{
// create an empty vector of the required size
InputPortsVector.resize(sizeof...(InputPortTypes));
}
void connectPorts(int InputPortIndex, boost::any c_OutputPort)
{
// connect ports
InputPortsVector[InputPortIndex] = c_OutputPort;
}
// this function needs to be modified to avoid using InputPortsTuple
template<int N>
void getInputPortValue(void)
{
std::cout <<
*boost::any_cast<decltype(std::get<N>(this -> InputPortsTuple))>(
InputPortsVector[N]
)(0) <<
std::endl;
}
};
我想删除对象 InputPortsTuple
并将其替换为某种形式的递归过程以推断 getInputPortValue
中的类型。
理想情况下,我希望 N
成为动态参数而不是模板参数。但是,我不确定这是否可行。
你可以简单地滥用 std::tuple_element
:
typename std::tuple_element<N, std::tuple<InputPortTypes...>>::type
注意:如果可以使用C++14,
std::tuple_element_t<N, std::tuple<InputPortTypes...>>
是做同样事情的更好方法。不过,并非所有常见的编译器都知道它。
我想通过索引获取可变参数模板中的类型。索引被指定为模板参数。 我设法找到了一个可行的 'hack',但我认为它不符合可变参数模板编程的精神。此外,它使用额外的内存。
这是带有一些解释的代码:
template <typename... InputPortTypes>
class PipelineReceiver
{
protected:
// This tuple is used for storing types only
// Hence, I would like to get rid of it, but I am not sure how.
std::tuple<
std::function<std::unique_ptr<InputPortTypes> (int)>...
> InputPortsTuple;
// This vector is used for storing the actual objects
// This is needed to be able to access/change its elements
// during run time later on.
// The vector is used for storage of function pointers (i.e. of type std::function)
// that represent methods of another object upstream the pipeline.
std::vector<boost::any> InputPortsVector;
public:
PipelineReceiver()
{
// create an empty vector of the required size
InputPortsVector.resize(sizeof...(InputPortTypes));
}
void connectPorts(int InputPortIndex, boost::any c_OutputPort)
{
// connect ports
InputPortsVector[InputPortIndex] = c_OutputPort;
}
// this function needs to be modified to avoid using InputPortsTuple
template<int N>
void getInputPortValue(void)
{
std::cout <<
*boost::any_cast<decltype(std::get<N>(this -> InputPortsTuple))>(
InputPortsVector[N]
)(0) <<
std::endl;
}
};
我想删除对象 InputPortsTuple
并将其替换为某种形式的递归过程以推断 getInputPortValue
中的类型。
理想情况下,我希望 N
成为动态参数而不是模板参数。但是,我不确定这是否可行。
你可以简单地滥用 std::tuple_element
:
typename std::tuple_element<N, std::tuple<InputPortTypes...>>::type
注意:如果可以使用C++14,
std::tuple_element_t<N, std::tuple<InputPortTypes...>>
是做同样事情的更好方法。不过,并非所有常见的编译器都知道它。