使用C++0x变长参数模板实现元组

最近有空研究了一下C++0x相关的问题,并且在GCC4.6下用变长参数模板实现元组。

 

template<typename ... AllTypes>
struct MyTuple;

template<> struct MyTuple<> {};

template<int N, class T>
struct ElementType;

template<typename Head, typename ... Tail>
struct MyTuple<Head,Tail...>
{
    MyTuple(Head h, Tail... t)
        : tail(t...)
        , head(h)
    {
    }
    MyTuple(const MyTuple<Head,Tail...>& t)
        : tail(t.tail)
        , head(t.head)
    {
    }
    MyTuple(MyTuple<Head,Tail...>&& t)
        : tail(t.tail)
        , head(t.head)
    {
    }

    MyTuple<Tail...> tail;
    Head head;

    typedef Head HeadType;
    typedef MyTuple<Tail...> TailType;
};

//获取元组指定元素的值
template <int k>
struct get_class {
    template <typename Head, typename ... Tail>
    static typename ElementType<k,MyTuple<Head,Tail...> >::type& get(MyTuple<Head,Tail...>& t )
    {
         return get_class<k-1>::get(t.tail);
    }

    template <typename Head, typename ... Tail>
    static const typename ElementType<k,MyTuple<Head,Tail...> >::type& get(const MyTuple<Head,Tail...>& t )
    {
         return get_class<k-1>::get(t.tail);
    }
};

template <>
struct get_class<0> {

    template <typename Head, typename ... Tail>
    static typename MyTuple<Head,Tail...>::HeadType& get(MyTuple<Head,Tail...>& t )
    {
         return t.head;
    }

    template <typename Head, typename ... Tail>
    static const typename MyTuple<Head,Tail...>::HeadType& get(const MyTuple<Head,Tail...>& t )
    {
         return t.head;
    }
};

//推导元组指定元素的类型
template<int N, class T>
struct ElementType
{
private:
  typedef typename T::TailType Next;
public:
  typedef typename ElementType<N-1, Next>::type type;
};


template<class T>
struct ElementType<0, T>
{
  typedef typename T::HeadType type;
};


template < int k,typename Head, typename ... Tail>
typename ElementType<k,MyTuple<Head,Tail...> >::type& get(MyTuple<Head,Tail...>& t)
{
    return get_class<k>::get(t);
}

template < int k,typename Head, typename ... Tail>
const typename ElementType<k,MyTuple<Head,Tail...> >::type& get(const MyTuple<Head,Tail...>& t)
{
    return get_class<k>::get(t);
}

 使用方式:

    MyTuple<double,int,double,int,string,const char*> t(2.1,0,1.11,6666,"helloworld z","world");
    cout << get<0>(t) << get<1>(t) << get<2>(t) << get<3>(t) << get<4>(t) << get<5>(t) << std::endl;
    get<0>(t) = 100;
    get<1>(t) = 10;
    get<4>(t) = "gg world";

    const MyTuple<int,int,double,int,string> tc(0,0,111.1,5555,"helloworld");
    cout << get<0>(tc) << get<1>(tc) << get<2>(tc) << get<3>(tc) << get<4>(tc) << std::endl;

    cout << get<1>( MyTuple<double,char>(3.1415926,'c')) << std::endl;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值