C++实现的Tuple类,非常好用

C++实现的Tuple类,非常好用,新老编译器都支持。在编译器支持可变模版参数的情况下,这个Tuple支持任意多成员,不支持的情况下,支持的成员是有限的,现在只支持3个成员,需要支持跟多成员,也可以轻松扩展下。有码有真相:

 
  1. #include <iostream>  
  2. #include <typeinfo>  
  3.   
  4. using namespace std;  
  5.   
  6. #ifdef __GXX_EXPERIMENTAL_CXX0X__  
  7. template <typename... Rest> struct Tuple;  
  8. template <> struct Tuple<> {};  
  9.    
  10. template <typename First, typename ... Rest>  
  11. struct Tuple<First, Rest...> : public Tuple<Rest...> {  
  12.     Tuple() : value() {}  
  13.     Tuple(First &&first, Rest&&... rest)  
  14.         : value(std::forward<First>(first))  
  15.         , Tuple<Rest...>(std::forward<Rest>(rest)...)  
  16.     {}  
  17.     First value;  
  18. };  
  19.   
  20. template <size_t N, typename TP> struct Tuple_Element;  
  21.   
  22. template <typename T, typename ... Rest>  
  23. struct Tuple_Element<0, Tuple<T, Rest...>> {  
  24.     typedef T type;  
  25.     typedef Tuple<T, Rest...> TPType;  
  26. };  
  27.   
  28. template <size_t N, typename T, typename ... Rest>  
  29. struct Tuple_Element<N, Tuple<T, Rest...>>  
  30.     : public Tuple_Element<N - 1, Tuple<Rest...>>  
  31. {};  
  32.   
  33. template <size_t N, typename ... Rest>  
  34. typename Tuple_Element<N, Tuple<Rest...>>::type& get(Tuple<Rest...> &tp) {  
  35.     typedef typename Tuple_Element<N, Tuple<Rest...>>::TPType type;  
  36.     return ((type &)tp).value;  
  37. }  
  38.   
  39. #else  
  40.   
  41. struct VoidType;  
  42.   
  43. template <typename T1, typename T2, typename T3>  
  44. struct Tuple;  
  45.   
  46. template <>  
  47. struct Tuple<VoidType, VoidType, VoidType> {  
  48. };  
  49.   
  50. template <typename T1>  
  51. struct Tuple<T1, VoidType, VoidType> {  
  52.     Tuple()  
  53.     {}  
  54.   
  55.     Tuple(const T1 &v1)  
  56.         : value(v1)  
  57.     {}  
  58.   
  59.     T1 value;  
  60. };  
  61.   
  62. template <typename T1, typename T2>  
  63. struct Tuple<T1, T2, VoidType>  
  64.     : public Tuple<T2, VoidType, VoidType>  
  65. {  
  66.     Tuple()  
  67.     {}  
  68.   
  69.     Tuple(const T1 &v1, const T2 &v2)  
  70.         : value(v1)  
  71.         , Tuple<T2, VoidType, VoidType>(v2)  
  72.     {}  
  73.   
  74.     T1 value;  
  75. };  
  76.   
  77. template <typename T1 = VoidType, typename T2 = VoidType, typename T3 = VoidType>  
  78. struct Tuple  
  79.     : public Tuple<T2, T3, VoidType>  
  80. {  
  81.     Tuple(const T1 &v1, const T2 &v2, const T3 &v3)  
  82.         : value(v1)  
  83.         , Tuple<T2, T3, VoidType>(v2, v3)  
  84.     {}  
  85.   
  86.     T1 value;  
  87. };  
  88.   
  89. template <size_t N, typename T1, typename T2, typename T3>  
  90. struct Tuple_Element;  
  91.   
  92. template <>  
  93. struct Tuple_Element<0, VoidType, VoidType, VoidType> {  
  94. };  
  95.   
  96. template <typename T1, typename T2, typename T3>  
  97. struct Tuple_Element<0, T1, T2, T3> {  
  98.     typedef T1 type;  
  99.     typedef Tuple<T1, T2, T3> TPType;  
  100. };  
  101.   
  102. template <size_t N, typename T1, typename T2, typename T3>  
  103. struct Tuple_Element  
  104.     : Tuple_Element<N - 1, T2, T3, VoidType>  
  105. {  
  106. };  
  107.   
  108. template <size_t N, typename T1, typename T2, typename T3>  
  109. typename Tuple_Element<N, T1, T2, T3>::type& get(Tuple<T1, T2, T3> &tp) {  
  110.     typedef typename Tuple_Element<N, T1, T2, T3>::TPType type;  
  111.     return ((type &)tp).value;  
  112. }  
  113.   
  114. #endif  
  115.   
  116. int main() {  
  117.     Tuple<> tmp();  
  118.     //cout << typeid(get<0>(tmp)).name() << endl;  
  119.     Tuple<int, string, double> tp(3, "2", 1.);  
  120.     cout<<get<0>(tp) << " " << typeid(get<0>(tp)).name() <<endl;  
  121.     cout<<get<1>(tp) << " " << typeid(get<1>(tp)).name() <<endl;  
  122.     cout<<get<2>(tp) << " " << typeid(get<2>(tp)).name() <<endl;  
  123.     cout << ((Tuple<string, double> &)tp).value << endl;  
  124.     Tuple<int> ft1;  
  125.     Tuple<intfloat> ft2;  
  126.     return 0;  
  127. }  
  128. 详情请访问libgod官网..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值