Get<>
structure が与えられた場合、修飾された idが存在しない場合H
は型Get<H>::type
がH
それ自体であり、そうでない場合は型がそれ自体であるテンプレート クラス (ここで名前を付けます) を実装しようとしています。次のコードの何が問題なのか理解できません。 H::der
Get<H::der>::type
#include <iostream>
#include <typeinfo>
using namespace std;
template<class U, class V = void>
struct Get
{
static const char id = 'A';
typedef U type;
};
template<class U>
struct Get<U,typename U::der>
{
static const char id = 'B';
typedef typename Get<typename U::der>::type type;
};
struct H1
{ };
struct H2
{ typedef double der; };
struct H3
{ typedef void der; };
struct H4
{ typedef H2 der; };
void print(char id, const char* name)
{
cout << id << ", " << name << endl;
}
int main(int , char *[])
{
print(Get<H1>::id, typeid(Get<H1>::type).name()); // prints "A, 2H1", OK
print(Get<H2>::id, typeid(Get<H2>::type).name()); // prints "A, 2H2", why?
print(Get<H3>::id, typeid(Get<H3>::type).name()); // prints "B, v" , OK
print(Get<H4>::id, typeid(Get<H4>::type).name()); // prints "A, 2H4", why?
}
このコードが期待どおりに動作するように助けてください。より具体的には、Get< H2 >::type
が に等しくdouble
、 も同じだったらいいのにと思いGet< H4 >::type
ます。