2

入力できるようにしたいのは次のとおりです。

class foo : public watchKeys<A, B, C> {}; //Or any list of keys

Boost::mpl にはシーケンスがあり、これを実行できますが、実行する必要はありません。

class foo : public watchKeys<mpl::list<A, B, C> > {};

内部が「醜い」または冗長であることは気にしませんが、最終的にwatchKeysを使用する方法が非常にシンプルで直感的であることを望んでいます. ブーストがどのようにそれを行っているかもわかりませんが、それは私とテンプレートの間にマクロのレイヤーがあるためのようです.

これについてどうすればよいですか?タイプの数ごとにテンプレートの巨大なリストを作成したくないのですが、それが唯一の方法である場合は...

編集:やりたいことを実行する方法がないことはかなり確信しました(ほとんどですが、可変数のマクロ引数を持つことはできません)が、質問は依然として有用で有益な回答を生成しています.

4

2 に答える 2

1

タイプの数ごとのテンプレートの巨大なリストは、C++の現在のバージョンでそれを行う唯一の方法です。実行方法の例については、boost::tupleを参照してください。

C ++ 0Xは可変個引数テンプレートをサポートしていますが、まだ十分にサポートされていません(ただし、GCCの最新バージョンには実験的なサポートがあると思います)。

于 2010-02-24T14:59:06.587 に答える
0

または、再帰的に行うこともできます

template<typename Head, typename Tail>
struct list { };

struct emptylist { };

class foo : public watchKeys<list<A, 
                             list<B, 
                             list<C, emptylist> > > > { };

その後、このように処理できます

template<typename List>
struct process;

template<typename Head, typename Tail>
struct process< list<Head, Tail> > : process<Tail> { 
  // process Head
};

template<>
struct process<emptylist> { };
于 2010-03-08T15:30:04.193 に答える