即席構造体


#include

//なんとなくstaticチェック
template
struct StaticAssert
{
};

template <>
struct StaticAssert<0>;

template
struct MemberLink;

#define MEM_LINK2(a,b) MemberLink
#define MEM_LINK3(a,b,c) MemberLink
#define MEM_LINK4(a,b,c,d) MemberLink

//n番目のメンバーの型を返す
template
struct GetMemberType
{
typedef T type;
};

template
struct GetMemberType<0,MemberLink >
{
typedef T type;
};

template
struct GetMemberType >
{
typedef typename GetMemberType::type type;
};

//n番目のメンバーを返す(const版はつくってない)
template
struct GetMember
{
typename T& operator()(T& t)
{
StaticAssert<(n==0)>();
return t;
}
};

template
struct GetMember<0,MemberLink >
{
typename T& operator()(MemberLink& t)
{
return t.t;
}
};


template
struct GetMember >
{
typename GetMemberType::type& operator()(MemberLink& t)
{
StaticAssert<(n>0)>();
return GetMember()(t.u);
}
};

//本体
template
struct MemberLink
{
T t;
U u;
template
typename GetMemberType::type& GetMem()
{
return GetMember()(*this);
}
template
struct GetMemType
{
typedef typename GetMemberType::type type;
};
};
template
bool operator<(const MemberLink& lhs,const MemberLink& rhs)
{
return lhs.t myset;

for(int i=0;i<100;++i)
{
ztype z;
z.GetMem<0>()=p[rand()%16];
z.GetMem<1>()=rand();
z.GetMem<2>()=rand();
z.GetMem<3>()=rand();
myset.insert(z);
}

std::set::iterator itr=myset.begin();
std::set::iterator end=myset.end();
for(;itr!=end;++itr)
{
std::cout << itr->GetMem<0>() << std::endl;
std::cout << typeid(ztype::GetMemType<0>::type).name() << std::endl;
std::cout << itr->GetMem<1>() << std::endl;
std::cout << typeid(ztype::GetMemType<1>::type).name() << std::endl;
std::cout << itr->GetMem<2>() << std::endl;
std::cout << typeid(ztype::GetMemType<2>::type).name() << std::endl;
std::cout << itr->GetMem<3>() << std::endl;
std::cout << typeid(ztype::GetMemType<3>::type).name() << std::endl;
std::cout << std::endl;
}

return 0;
}

特に今さら珍しくもないけど型を並べて構造体を即席でつくるテンプレート。
本来はTypeListみたいな型だけのリストを与えると、その型どおりメンバーを割り当ててくれるほうが
設計的にはいいんだろうけど
もともと始まりはSTLの連想配列で即席で使う構造体の定義とかoperator<とかを
いちいち書くのめんどいなぁってところからで、TypeListに興味があるわけじゃないし
当初の目的は達成したからよしとしよう。