このようなことが行われているのを見たのを覚えています:
template <ListOfTypenames>
class X : public ListOfTypenames {};
つまり、X は、テンプレート引数として渡された型名の可変長リストから継承します。もちろん、このコードは仮説です。
ただし、これに関する参照は見つかりません。出来ますか?C++0xですか?
このようなことが行われているのを見たのを覚えています:
template <ListOfTypenames>
class X : public ListOfTypenames {};
つまり、X は、テンプレート引数として渡された型名の可変長リストから継承します。もちろん、このコードは仮説です。
ただし、これに関する参照は見つかりません。出来ますか?C++0xですか?
現在の C++ で実行できます。テンプレートに「十分に大きい」数のパラメーターを指定し、それらにデフォルトを指定します。
class nothing1 {};
class nothing2 {};
class nothing3 {};
template <class T1 = nothing1, class T2 = nothing2, class T3 = nothing3>
class X : public T1, public T2, public T3 {};
または、より洗練されて再帰を使用することもできます。まず、テンプレートを前方宣言します。
class nothing {};
template <class T1 = nothing, class T2 = nothing, class T3 = nothing>
class X;
次に、すべてのパラメーターがデフォルトの場合に特化します。
template <>
class X<nothing, nothing, nothing> {};
次に、一般的なテンプレートを適切に定義します (以前は前方宣言のみでした)。
template <class T1, class T2, class T3>
class X : public T1, public X<T2, T3>
基本クラスで X を継承しているのに、最初のパラメーターが抜けていることに注意してください。したがって、それらはすべて 1 つの場所に沿ってスライドします。最終的に、それらはすべてデフォルトになり、何も継承しない特殊化が開始され、再帰が終了します。
更新:以前にこのようなものを投稿したことが奇妙な感じでした。何を推測しますか...
C++0x Variadic Templatesを参照しているようです。Lokiの Alexandrescu のTypeListコンストラクトを使用して、同じ効果を実現することもできます。
問題の可変個引数テンプレートの構文は次のようになると思います。
template <typename...T>
class X : public T... {};
他の人がすでに回答したように、可変個引数テンプレートは次の標準の一部ですが、現在の C++ でエミュレートできます。このための便利なツールの 1 つは、Boost.MPLライブラリを使用することです。コードでは、単一のテンプレート パラメーター (「Typelist」と名付けましょう) を記述し、テンプレートのユーザーは MPL シーケンスで typelist をラップします。例:
#include "YourType.h"
#include "FooBarAndBaz.h"
#include <boost/mpl/vector.hpp>
YourType<boost::mpl::vector<Foo, Bar, Baz> > FooBarBaz;
「YourType」の実装では、さまざまなメタ関数を使用して Typelist の要素にアクセスできます。たとえば、リストat_c<Typelist, N>
のN
th 要素です。別の例として、質問の「X」クラスは次のように記述できますinherit_linearly
。
//Warning: Untested
namespace bmpl = boost::mpl;
template<class Typelist>
class X : bmpl::inherit_linearly<Typelist, bmpl::inherit<bmpl::_1, bmpl::_2> >::type
{
...
};
テンプレートの可変数は、次の C++ 標準の一部です。ただし、GCC (バージョン 4.3 以降) を使用している場合は、その味を知ることができます。GCC で利用可能な C++0x 機能のリストを次に示します。Variadic テンプレートを探しています。
ところで、Earwicker によって説明されている継承メカニズムを実現する方法についての正式な参照が必要な場合は、本C++ Templatesにあります。