zoukankan      html  css  js  c++  java
  • 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官网..
  • 相关阅读:
    String.Split()函数
    Java的位运算符具体解释实例——与(&amp;)、非(~)、或(|)、异或(^)
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    Java中Scanner的使用方法
    C++经典面试题
    人脸识别算法初次了解
    ShareSDK的简化压缩和使用样例
    hdu 1316 How Many Fibs? (模拟高精度)
    AABB包围盒、OBB包围盒、包围球的比較
    Windows 7系统安装MySQL5.5.21图解
  • 原文地址:https://www.cnblogs.com/libgod/p/3445020.html
Copyright © 2011-2022 走看看