C++ での型の任意の長さのリストからのテンプレート化
-
22-09-2019 - |
質問
入力できるようにしたいのは次のとおりです。
class foo : public watchKeys<A, B, C> {}; //Or any list of keys
Boost::mpl にはシーケンスがあり、これを使用してこれを行うことができますが、私は次のことを行う必要はありません。
class foo : public watchKeys<mpl::list<A, B, C> > {};
内部が「醜い」または冗長であることは気にしませんが、watchKeys の最終的な使用方法が非常にシンプルで直感的であることを望みます。また、ブーストがどのようにそれを行っているのかもわかりませんが、それは私とテンプレートの間にマクロの層があるためのようです。
これについてはどうすればよいでしょうか?私が好むのは ない タイプの数ごとにテンプレートの巨大なリストを作成する必要がありますが、それが唯一の場合はそれが唯一の方法です...
編集:私がやりたいことを実行する方法はないということはかなり確信していますが(ただし、可変数のマクロ引数を持つことはできません)、この質問はまだ有用で有益な回答を生成しています。
解決
の 種類数ごとのテンプレートの膨大なリスト 現在のバージョンの C++ でこれを行う唯一の方法です。実行方法の例については、boost::tuple を参照してください。
C++0X サポートします 可変個引数テンプレート, 、しかし、それはまだ十分にサポートされていません(ただし、GCCの最新バージョンでは実験的なサポートがあると思います)。
他のヒント
また、あなたが再帰的にそれを行うことができます。
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> { };
所属していません StackOverflow