tuple想必人人都会用,究之实质,其实就是模板全特化及部分特化的又一种应用而已。简要的实现如下:
template<typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void>
struct Tuple
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a,
typename traits::type_traits<T2>::const_reference b,
typename traits::type_traits<T3>::const_reference c,
typename traits::type_traits<T4>::const_reference d)
:a_(a),b_(b),c_(c),d_(d)
{}
T1 a_;
T2 b_;
T3 c_;
T4 d_;
};
template<typename T1, typename T2, typename T3>
struct Tuple<T1,T2,T3,void>
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a,
typename traits::type_traits<T2>::const_reference b,
typename traits::type_traits<T3>::const_reference c)
:a_(a),b_(b),c_(c)
{}
T1 a_;
T2 b_;
T3 c_;
};
template<typename T1, typename T2>
struct Tuple<T1,T2,void,void>
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a,
typename traits::type_traits<T2>::const_reference b)
:a_(a),b_(b)
{}
T1 a_;
T2 b_;
};
template<typename T1>
struct Tuple<T1,void,void,void>
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a)
:a_(a)
{}
T1 a_;
};
template<>
struct Tuple<void,void,void,void>
{
Tuple(){}
};
template<typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void>
struct Tuple
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a,
typename traits::type_traits<T2>::const_reference b,
typename traits::type_traits<T3>::const_reference c,
typename traits::type_traits<T4>::const_reference d)
:a_(a),b_(b),c_(c),d_(d)
{}
T1 a_;
T2 b_;
T3 c_;
T4 d_;
};
template<typename T1, typename T2, typename T3>
struct Tuple<T1,T2,T3,void>
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a,
typename traits::type_traits<T2>::const_reference b,
typename traits::type_traits<T3>::const_reference c)
:a_(a),b_(b),c_(c)
{}
T1 a_;
T2 b_;
T3 c_;
};
template<typename T1, typename T2>
struct Tuple<T1,T2,void,void>
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a,
typename traits::type_traits<T2>::const_reference b)
:a_(a),b_(b)
{}
T1 a_;
T2 b_;
};
template<typename T1>
struct Tuple<T1,void,void,void>
{
Tuple(){}
Tuple(typename traits::type_traits<T1>::const_reference a)
:a_(a)
{}
T1 a_;
};
template<>
struct Tuple<void,void,void,void>
{
Tuple(){}
};