週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

つい魔が差して Modern C++ DesignのTypeListをそらで書こうとしたところ、コンパイラエラー祭りになりました。

TypeListは型のリストです。まず次の型を書きます。

template<typename H, typename T>
struct TypeList {
  typedef H Head;
  typedef T Tail;
};

これをcons cellと見立てます。これを使うと、たとえば次のような、char, short, longからなるリストが作れます。NullListはstruct NullList{};といった程度のものです。

TypeList<char, TypeList<short, TypeList<long, NullList> > >
こういったリストを用いて、たとえばchar, short, longすべてについて何かを行うといった関数が書けます。

ここまではうまく書けたのですが、次で失敗をしました。TypeListの列を書くのが面倒なので、普通はラッパーマクロを書きます。

#define TLIST0() NullList
#define TLIST1(a) TypeList<a, TLIST0()>
#define TLIST2(a, b) TypeList<a, TLIST1(b)>
#define TLIST3(a, b, c) TypeList<a, TLIST2(b, c)>
#define TLIST4(a, b, c, d) TypeList<a, TLIST3(b, c, d)>

これを使って、たとえば上のリストはTLIST3(char, short, long)とできます。

さて、上のTLISTnの定義はコンパイルできません。TLIST3(char, short, long)と書いたとたんにエラーになるはずです。おかしいのはどこでしょうか。


5/13追記:どうもこのままで正しいらしいです。私は何かエラーを受けたのですがそれはTLIST由来ではなかったらしいです。不正確ですみません。

スポンサーサイト
コメント
この記事へのコメント
こんな罠が(笑
2008/05/13(火) 00:58 | URL | phoenix #K97lpksc[ 編集]
CygwinのGCC(g++ 3.4.4)でも、MinGWのGCC(g++ 4.3.0)でも、Visual C++ 2005でも何のエラーもなくコンパイルできる。

int
main()
{
typedef TLIST3(char, short, long) T;
std::cout << sizeof(T::Head) << std::endl;
std::cout << sizeof(T::Tail::Head) << std::endl;
std::cout << sizeof(T::Tail::Tail::Head) << std::endl;
return 0;
}

なんか間違ってる?
2008/05/13(火) 21:56 | URL | 納豆神 #-[ 編集]
あれ、何でこれコンパイルできるの? こちらでコンパイルできるのを確認。

むしろコンパイルできない短い例を作れない。なんでだろう。
2008/05/13(火) 23:21 | URL | Gus #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/345-accf6190
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。