C++ I';我在C+中创建一个元组类+;11使用可变模板。如何使用它的实例变量?

C++ I';我在C+中创建一个元组类+;11使用可变模板。如何使用它的实例变量?,c++,c++11,tuples,variadic-templates,C++,C++11,Tuples,Variadic Templates,假设我这样定义一个元组: template<typename... Args> class Tuple { Method () {...}; }; 模板 类元组 { 方法(){…}; }; 考虑到Tuple的实例变量可能有未定义的数量,我如何定义和访问Tuple的实例变量?有几种方法。最简单的方法是像LISP那样使用结构递归:元组是 空元组,或 一对(head,tail),其中head是元组的第一个元素,tail是包含其余元素的元组 在C++中,这将是类似的: te

假设我这样定义一个元组:

template<typename... Args>
class Tuple 
{
    Method () {...};
};
模板
类元组
{
方法(){…};
};

考虑到Tuple的实例变量可能有未定义的数量,我如何定义和访问Tuple的实例变量?

有几种方法。最简单的方法是像LISP那样使用结构递归:元组是

  • 空元组,或
  • 一对
    (head,tail)
    ,其中
    head
    是元组的第一个元素,
    tail
    是包含其余元素的元组
<>在C++中,这将是类似的:

template <typename... Elems>
struct tuple; // undefined

template <>
struct tuple<> { }; // empty tuple

template <typename Head, typename... Tail>
struct tuple<Head, Tail...> {
    Head first_elem;
    tuple<Tail...> rest;
};
模板
结构元组;//未定义
样板
结构元组{};//空元组
样板
结构元组{
首当其冲;
元组休息;
};
然后您需要一个
get
函数模板来通过索引实际访问元素;如果您了解元组本身是如何递归定义的,那么它应该很容易实现


正如我所说的,还有其他更复杂的实现方法——出于各种原因,上述方法并不是大多数现实世界的
std::tuple
实现所采用的方法。

有几种方法。最简单的方法是像LISP那样使用结构递归:元组是

  • 空元组,或
  • 一对
    (head,tail)
    ,其中
    head
    是元组的第一个元素,
    tail
    是包含其余元素的元组
<>在C++中,这将是类似的:

template <typename... Elems>
struct tuple; // undefined

template <>
struct tuple<> { }; // empty tuple

template <typename Head, typename... Tail>
struct tuple<Head, Tail...> {
    Head first_elem;
    tuple<Tail...> rest;
};
模板
结构元组;//未定义
样板
结构元组{};//空元组
样板
结构元组{
首当其冲;
元组休息;
};
然后您需要一个
get
函数模板来通过索引实际访问元素;如果您了解元组本身是如何递归定义的,那么它应该很容易实现


正如我所说的,还有其他更复杂的实现方法-出于各种原因,上述不是大多数真实世界的
std::tuple
实现的方式。

我认为最简单的方法是使用boost tuple库-简单易用、经过良好测试和记录:


我认为最简单的方法是使用boost元组库-简单易用、经过良好测试和记录:


事实上,他们就是这样做的。不过,对于空基优化,非静态成员可能会被基类子对象替换。这是一个有用的解释。对这些优化的任何进一步描述或对该主题参考材料的指导都将不胜感激。谢谢我很想看到get函数被写出来。事实上,他们就是这样做的。不过,对于空基优化,非静态成员可能会被基类子对象替换。这是一个有用的解释。对这些优化的任何进一步描述或对该主题参考材料的指导都将不胜感激。谢谢我很想看到get函数被写出来。