c++11 一个简易的tuple实现

2014-11-24 09:55:07 · 作者: · 浏览: 2
实现一个简易版的c++11 tuple。
我使用的编译器是gcc,codeblocks13.12自带的,哪个版本我不熟gcc也没去查。
大致看了下他家的tuple实现,多继承,tuple之上还有2个辅助类,走的是类似loki中GenScatterHierarchy的路子。1092行代码,不是盖的。。。
有些强迫症,不打算用多继承,,虽然并不会实例化来,看着闹心。
只考虑实现到POD类型的基本支持就行了,什么右值之类的我还没看到,就不搞了,仅供参考。
个人觉得tuple保存POD类型值就足够了,泛滥就堕落了。
gcc下出现一个reorder警告,不知道vs有没有。递归继承,构造函数带可变参数造成的。
单继承版本确实比多继承版本美得多了,可变模板参数真是个好东西。
复制代码
//////////////////////////////////////////////////////////
template struct tuple;
template<> struct tuple<> {};
typedef tuple<> nulltuple;
//////////////////////////////////////////////////////////
template
struct tuple : public tuple
{
typedef T value_type;
typedef tuple base_type;
tuple(T v, TList... tails):_value(v),base_type(tails...) {}
const T& head() const { return this->_value; }
T& head() { return this->_value; }
protected:
T _value;
};
template
struct tuple : public nulltuple
{
typedef T value_type;
typedef nulltuple base_type;
tuple(T v):_value(v) {}
const T& head() const { return this->_value; }
T& head() { return this->_value; }
protected:
T _value;
};
//////////////////////////////////////////////////////////
template struct tuple_at;
template
struct tuple_at< N, tuple >
{
typedef typename tuple_at< N-1, tuple >::value_type value_type;
typedef typename tuple_at< N-1, tuple >::tuple_type tuple_type;
};
template
struct tuple_at< 0, tuple >
{
typedef T value_type;
typedef tuple tuple_type;
};
template<>
struct tuple_at<0, nulltuple>
{
typedef nulltuple value_type;
typedef nulltuple tuple_type;
};
//////////////////////////////////////////////////////////
template struct tuple_helper;
template
struct tuple_helper>
{
typedef tuple tuple_type;
typedef typename tuple_at::tuple_type base_tuple_type;
typedef typename tuple_at::value_type return_type;
constexpr static const return_type& get(const tuple_type& tuple_)
{
return static_cast(tuple_).head();
}
static void get(const nulltuple& tuple_) {}
};
//////////////////////////////////////////////////////////
template
constexpr const typename tuple_at >::value_type&
tuple_get(const tuple& tuple_)
{
return tuple_helper< N, tuple >::get(tuple_);
}
复制代码
例子:
复制代码
#include "TypeTuple.h"
#include
int main()
{
bool b;
tuple pp = {10, 0.1234, 'a'};
b = std::is_same>::value_type, char >::value;
std::cout << "is same: " << b << std::endl;
b = std::is_same>::tuple_type, tuple >::value;
std::cout << "is same: " << b << std::endl;
std::cout << tuple_get<0>(pp)<<" "<< tuple_get<1>(pp) <<" "<(pp) << std::endl;
std::tuple cc{10, 0.1234, 'a'};
std::cout << sizeof(pp) << " " << sizeof(cc) << std::endl;
tuple ppc = pp;
std::cout << tuple_get<0>(ppc)<<" "<< tuple_get<1>(ppc) <<" "<(ppc) << std::endl;
return 0;
}