c++ Template Tuple 元组
#ifndef __TUPLE2_H
#define __TUPLE2_H
#include "duo.h"
class NullT
{
};
template<typename P1,typename P2 = NullT,typename P3= NullT,typename P4 = NullT,typename P5 =NullT>
class Tuple
: public Duo<P1,typenameTuple<P2,P3,P4,P5,NullT>::BaseT>
{
public:
typedef Duo<P1,typenameTuple<P2,P3,P4,P5,NullT>::BaseT> BaseT;
Tuple()
{
}
Tuple(
TypeOp<P1>::RefConstTa1,
TypeOp<P2>::RefConstTa2,
TypeOp<P3>::RefConstTa3 = NullT(),
TypeOp<P4>::RefConstTa4 = NullT(),
TypeOp<P5>::RefConstTa5 = NullT()
):BaseT(a1,Tuple<P2,P3,P4,P5,NullT>(a2,a3,a4,a5))
{
}
protected:
private:
};
template<typename P1,typenameP2>
class Tuple<P1,P2,NullT,NullT,NullT>:public Duo<P1,P2>
{
public:
typedef Duo<P1,P2>BaseT;
Tuple()
{
}
Tuple(TypeOp<P1>::RefConstTa1,
TypeOp<P2>::RefConstTa2,
TypeOp<NullT>::RefConstT =NullT(),
TypeOp<NullT>::RefConstT =NullT(),
TypeOp<NullT>::RefConstT =NullT()
): BaseT(a1,a2)
{
}
};
template <typename P1>
classTuple<P1,NullT,NullT,NullT,NullT> :public Duo<P1,void>
{
public:
typedefDuo<P1,void> BaseT;
Tuple()
{}
Tuple(typenameTypeOp<P1>::RefConstT a1,
typenameTypeOp<NullT>::RefConstT =NullT(),
typenameTypeOp<NullT>::RefConstT =NullT(),
typenameTypeOp<NullT>::RefConstT =NullT(),
typenameTypeOp<NullT>::RefConstT =NullT())
: BaseT(a1)
{}
}
;
// convenience function for 1 argument
template <typename T1>
inline Tuple<T1> make_tuple(T1 const&a1)
{
returnTuple<T1>(a1);
}
// convenience function for 2 arguments
template <typename T1, typenameT2>
inline Tuple<T1,T2> make_tuple(T1const &a1, T2 const &a2)
{
returnTuple<T1,T2>(a1,a2);
}
// convenience function for 3 arguments
template <typename T1, typename T2, typenameT3>
inline Tuple<T1,T2,T3> make_tuple(T1const &a1, T2 const &a2,
T3 const &a3)
{
returnTuple<T1,T2,T3>(a1,a2,a3);
}
// convenience function for 4 arguments
template <typename T1, typename T2, typename T3,typename T4>
inline Tuple<T1,T2,T3,T4>make_tuple(T1 const &a1, T2 const&a2,
T3const &a3, T4 const &a4)
{
returnTuple<T1,T2,T3,T4>(a1,a2,a3,a4);
}
// convenience function for 5 arguments
template <typename T1, typename T2, typenameT3,typename T4, typename T5>
inline Tuple<T1,T2,T3,T4,T5>make_tuple(T1 const &a1, T2 const&a2,
T3 const &a3, T4 const &a4,
T5 const &a5)
{
returnTuple<T1,T2,T3,T4,T5>(a1,a2,a3,a4,a5);
}
#endif
以上是Tuple定义和使用内联函数.
#ifndef _DUO_H
#define _DUO_H
#include "Typeof.h"
template <typename T1, typenameT2>
class Duo
{
public:
typedefT1 Type1; // type of firstfield
typedefT2 Type2; // type of secondfield
enum{ N = 2}; //number of fields
private:
T1value1; // value of first field
T2value2; // value of second field