C++ boost元组如何';获取';工作方法?

C++ boost元组如何';获取';工作方法?,c++,boost,boost-tuples,C++,Boost,Boost Tuples,在深入研究了优秀的boost tuple类(tuple_basic.hpp)的源代码之后,我发现在访问tuple成员的“get”方法中使用了递归模板算法 我很难理解的是,一个数值模板化的参数是如何映射到一个特定的成员名的?此外,递归模板函数是否总是收敛到第一个元素(如递归模板函数的停止条件get())?如何访问大于零的元素?作为一个小例子,您可以想象这样的情况-现在只是一个固定类型的元组: template <int N> struct MyTuple : MyTuple<N

在深入研究了优秀的boost tuple类(tuple_basic.hpp)的源代码之后,我发现在访问tuple成员的“get”方法中使用了递归模板算法


我很难理解的是,一个数值模板化的参数是如何映射到一个特定的成员名的?此外,递归模板函数是否总是收敛到第一个元素(如递归模板函数的停止条件get())?如何访问大于零的元素?

作为一个小例子,您可以想象这样的情况-现在只是一个固定类型的元组:

template <int N> struct MyTuple : MyTuple<N - 1>
{
    T data;
};
template <> struct MyTuple<0> { };
这里的关键是在
K=0
时有一个专门化,它提取实际的元素,并向上转换继承层次结构,直到到达为止。最后,我们通过一个函数模板弹射元组类型推断:

template <int K, int N> T & get(MyTuple<N> & t)
{
    return get_impl<K>::get(t);
}
template T&get(MyTuple&T)
{
返回get_impl::get(t);
}

我理解这一点,但我不知道如何使用递归模板方法处理由多个值组成的元组?@GearoidMurphy:您只需将可变模板参数添加到元组定义中即可。您可以使用
auto
/
decltype
作为
get
的返回值,以简化操作。变量模板不是C++x11吗?boost元组实现不依赖于此feature@GearoidMurphy:您可以使用大量难看的预处理器宏在有限的范围内“伪造”可变模板。我认为Boost就是这么做的。但从概念上来说,我们认为是“可变的”。
template <int K, int N> T & get(MyTuple<N> & t)
{
    return get_impl<K>::get(t);
}