在深入研究了优秀的boost元组类(tuple_basic.hpp)的源代码之后,我可以看到在“get”方法中使用了一种递归模板算法来访问元组成员。
我正在努力理解的是一个数字模板化的参数如何映射到一个特定的成员名称?另外,递归模板函数不是总是收敛到第一个元素(就像在递归模板函数的停止条件get<0>()中一样)吗?
发布于 2012-01-27 07:26:29
作为一个小例子,你可以想象这样的事情--现在只是一个固定类型的元组:
template <int N> struct MyTuple : MyTuple<N - 1>
{
T data;
};
template <> struct MyTuple<0> { };现实世界中的解决方案当然会为数据类型提供不同的模板参数,还会提供一个不同的构造函数,用第一个元素构造data,并将剩余的元素传递给基本构造函数。
现在我们可以尝试访问ith元素:
template <int K> struct get_impl
{
template <int N> static T & get(MyTuple<N> & t)
{
return get_impl<K - 1>::get(static_cast<MyTuple<N - 1>&>(t));
}
};
template <> struct get_impl<0>
{
template <int N> static T & get(MyTuple<N> & t)
{
return t.data;
}
};这里的关键是在K = 0时有一个专门化,它提取实际的元素,并转换继承层次结构,直到你到了那里。最后,我们通过一个函数模板弹射元组类型的推演:
template <int K, int N> T & get(MyTuple<N> & t)
{
return get_impl<K>::get(t);
}https://stackoverflow.com/questions/9026717
复制相似问题