从零开始写STL—模板元编程之tuple

tuple

Class template std::tuple is a fixed-size collection of heterogeneous values. It is a generalization of std::pair.

可以用来在bind中存储函数指针和参数

实现思路

不定参数模板 + 模板偏特化
tuple作为一个存储不定参数模板的类,分为一下几种偏特化形式:
template<>
struct tuple<> {};
template<typename T, typename... Args>
struct tuple<T, Args...> : public tuple<Args...>
template
struct tuple : public nulltuple
可以注意到每个模板struct tuple<T, Args...> : public tuple<Args...>作为其上一级模板的子类来展开,这样在获取tuple_at时从前向后维护一个当前元素的下标计数来存取元素

源码

template<typename... Args> struct tuple;

    template<>
    struct tuple<> {};
    typedef tuple<> nulltuple;

    template<typename T, typename... Args>
    struct tuple<T, Args...> : public tuple<Args...>
    {
        typedef tuple<T, Args...> self_type;
        typedef tuple<Args...> base_type;
        typedef T value_type;
        tuple(const T& v, const Args&... tails) :base_type(tails...), value(v) {}
        tuple(T&& v, Args&&... tails) :base_type(std::move(tails)...), value(std::forward<T>(v)) {}
        tuple(T&& v, Args&... tails) :base_type(std::move(tails)...), value(std::forward<T>(v)) {}
        tuple(T& v, Args&&... tails) :base_type(std::move(tails)...), value(std::forward<T>(v)) {}

        T& getval() 
        {
            return value;
        }

        T value;
    };

    template<typename T>
    struct tuple<T> : public nulltuple
    {
        typedef T value_type;
        tuple(const T& val) :value(val) {}

        T& getval() 
        {
            return value;
        }

        T value;
    };
    template<size_t n, typename T> struct tuple_at;

    template<size_t n, typename T,typename... Args>
    struct tuple_at<n, tuple<T,Args...>>
    {
        typedef typename tuple_at<n - 1, tuple<Args...>>::value_type value_type;
        typedef typename tuple_at<n - 1, tuple<Args...>>::tuple_type tuple_type;
    };

    template<typename T,typename... Args>
    struct tuple_at<0, tuple<T,Args...>>
    {
        typedef T value_type;
        typedef typename tuple<T, Args...> tuple_type;
    };

    template<typename T>
    struct tuple_at<0, tuple<T>>
    {
        typedef T value_type;
        typedef typename tuple<T> tuple_type;
    };

    template<>
    struct tuple_at<0,tuple<>>
    {
        typedef tuple<> tuple_type;
        typedef tuple<> value_type;
    };

    template<size_t n,typename... Args>
    typename tuple_at<n, tuple<Args...>>::value_type& tuple_get(tuple<Args...>& t)
    {
        typedef typename tuple_at<n, tuple<Args...>>::tuple_type ret_tuple_type;
        return static_cast<ret_tuple_type&>(t).getval();    
    }

转载于:https://www.cnblogs.com/joeylee97/p/8877246.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值