博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11 —— 解包 tuple 参数列表
阅读量:5152 次
发布时间:2019-06-13

本文共 1860 字,大约阅读时间需要 6 分钟。

  tuple 的主要用途,就是把各种类型的参数组合成一个新的数据关联体(结构体),相当于早期的 std::pair 的泛化版本。

  组合存储是方便了,但是,对于某些特定的应用场景,解包就成了个比较麻烦的事情。为此,我查看 gcc 8.2.0 版的 STL 源码,从 functional 文件中 提取出 tuple 索引号生成的代码,并略作更名(避免冲突),得到如下 nstuple 命名空间内的代码,这其中可变参数模板类的递归构建,用得甚是精妙,值得学习。

namespace nstuple{    template< size_t... _Indexes >    struct X_Index_tuple    {    };    /// Builds an X_Index_tuple< 0, 1, 2, ..., _Num - 1 >.    template< std::size_t _Num, typename _Tuple = X_Index_tuple<> >    struct X_Build_index_tuple;    template< std::size_t _Num, size_t... _Indexes >    struct X_Build_index_tuple<_Num, X_Index_tuple< _Indexes... > >        : X_Build_index_tuple< _Num - 1, X_Index_tuple< _Indexes..., sizeof...(_Indexes) > >    {    };    template< size_t... _Indexes >    struct X_Build_index_tuple< 0, X_Index_tuple< _Indexes... > >    {        typedef X_Index_tuple< _Indexes... > __type;    };}; // namespace nstuple

  有了 nstuple 中的代码,我们就可以利用 std::get() 操作,轻松的解包 tuple 的各个参数了,实现的示例代码如下所示:

#include 
#include
#include
namespace nstuple{ // 此处省略 nstuple 的代码,与上面提到的 nstuple 命名空间内的源码一致 // ......}; // namespace nstuplevoid test_func(int v1, int v2, float v3){ std::cout << "(v1, v2, v3) == " << "(" << v1 << ", " << v2 << ", " << v3 << ")" << std::endl;}using X_Tuple = std::tuple< int, int, float >;using X_Indices = nstuple::X_Build_index_tuple< std::tuple_size< X_Tuple >::value >::__type;template< size_t... _Ind >void _S_Invoke(X_Tuple && xtuple, nstuple::X_Index_tuple< _Ind... >){ // 解包 xtuple 参数,传递给 test_func() 函数调用 test_func(std::get< _Ind >(std::move(xtuple))...);}int main(int argc, char * argv[]){ X_Tuple xtuple{ 100, 200, 3.141593F }; _S_Invoke(std::forward< X_Tuple >(xtuple), X_Indices()); return 0;}

转载于:https://www.cnblogs.com/VxGaaagaa/p/10124281.html

你可能感兴趣的文章
TestDriven.NET 怎么设置快捷键keyboard shortcut(转)
查看>>
Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID,反之也行!...
查看>>
JavaServlet的文件上传和下载
查看>>
29. Populating Next Right Pointers in Each Node && Populating Next Right Pointers in Each Node II
查看>>
Linux与网络
查看>>
WOJ 1619
查看>>
软件构造的八个多维视图
查看>>
python学习一使用dict和set
查看>>
任务调度框架Quartz原理简介
查看>>
乌龟爬行问题
查看>>
vb6.0 快捷键
查看>>
201671010127 2016-2017-12 初学图形用户界面
查看>>
POJ-1061 青蛙的约会
查看>>
ZOJ-2836 Number Puzzle
查看>>
poj3463 Sightseeing(读题很重要)
查看>>
hdu6181 How Many Paths Are There(次短路条数[模板])
查看>>
python学习日记(常用模块)
查看>>
正则表达式和样式匹配
查看>>
8_分析一下JVM
查看>>
进程PCB
查看>>