• 从零开始写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();	
    	}
    
  • 相关阅读:
    《Mathematical Olympiad——组合数学》——染色问题
    《啊哈算法》——栈、队列、链表
    《Mathematical Olympiad——组合数学》——抽屉原理
    2749: [HAOI2012]外星人
    bzoj4241: 历史研究
    bzoj3210: 花神的浇花集会
    bzoj4998: 星球联盟
    bzoj2728: [HNOI2012]与非
    bzoj2669: [cqoi2012]局部极小值
    bzoj5441: [Ceoi2018]Cloud computing
  • 原文地址:https://www.cnblogs.com/joeylee97/p/8877246.html
Copyright © 2020-2023  润新知