变量模板容器类中是否可以使用无模板的getter?

Max*_*xpm 1 c++ oop variadic-templates c++11

据我所知,一个假设的可变参数模板元组类必须使用带有模板参数的getter.

int MyInt = MyTuple.Get<int>(0);
Run Code Online (Sandbox Code Playgroud)

这是不方便的,并且引入了错误的可能性.我不禁觉得有一种方法来构建类,所以你不必明确指定它.

int MyInt = MyTuple.Get(0);
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是Get()成员函数返回另一个类,它自己计算出类型,可能是通过比较typeid(Foo).name()某些预先计算列表中的值.但是,这仍然必须在运行时之前发生,而且我无法想出在编译时迭代这样的事情的方法.

对于可变参数模板容器类(如元组),是否有任何方法可以使用不需要显式指定类型的getter?

Pot*_*ter 7

你的意思是std::tuple

getter的template参数指定成员的索引,而不是类型.根据定义,元组的数量和类型在编译时是固定的.由于类型取决于索引,并且必须在编译时知道类型,因此必须模板化getter.

template< typename ... types >
struct tuple;

template< typename head, typename ... tail_types >
struct tuple {
    head value;
    tuple< tail_types ... > tail;
};

template<>
struct tuple<> {};

template< typename tuple, size_t index >
struct tuple_element;

template< typename head, typename ... tail, size_t index >
struct tuple_element< tuple< head, tail ... >, index >
    { typedef typename tuple_element< tail ..., index - 1 >::type type; };

template< typename head, typename ... tail >
struct tuple_element< tuple< head, tail ... >, 0 >
    { typedef head type; };

template< size_t index, typename tuple >
typename std::enable_if< index != 0, 
                   typename tuple_element< tuple, index >::type >::type
get( tuple const &t )
    { return get< index - 1 >( t.tail ); }

template< size_t index, typename tuple >
typename std::enable_if< index == 0,
                   typename tuple_element< tuple, index >::type >::type
get( tuple const &t )
    { return t.value; }
Run Code Online (Sandbox Code Playgroud)

等等