首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost tuple 'get‘方法是如何工作的?

boost tuple 'get‘方法是如何工作的?
EN

Stack Overflow用户
提问于 2012-01-27 06:56:43
回答 1查看 747关注 0票数 1

在深入研究了优秀的boost元组类(tuple_basic.hpp)的源代码之后,我可以看到在“get”方法中使用了一种递归模板算法来访问元组成员。

我正在努力理解的是一个数字模板化的参数如何映射到一个特定的成员名称?另外,递归模板函数不是总是收敛到第一个元素(就像在递归模板函数的停止条件get<0>()中一样)吗?

EN

回答 1

Stack Overflow用户

发布于 2012-01-27 07:26:29

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

代码语言:javascript
运行
复制
template <int N> struct MyTuple : MyTuple<N - 1>
{
    T data;
};
template <> struct MyTuple<0> { };

现实世界中的解决方案当然会为数据类型提供不同的模板参数,还会提供一个不同的构造函数,用第一个元素构造data,并将剩余的元素传递给基本构造函数。

现在我们可以尝试访问ith元素:

代码语言:javascript
运行
复制
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时有一个专门化,它提取实际的元素,并转换继承层次结构,直到你到了那里。最后,我们通过一个函数模板弹射元组类型的推演:

代码语言:javascript
运行
复制
template <int K, int N> T & get(MyTuple<N> & t)
{
    return get_impl<K>::get(t);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9026717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档