11

シナリオは次のとおりです。可変数のミックスインを持つことができるホストクラスが必要です(可変個引数テンプレートではそれほど難しくありません。たとえば、http: //citeseerx.ist.psu.edu/viewdoc/summary?doiを参照してください)。 = 10.1.1.103.144)。ただし、(CRTPイディオムを使用して)パブリックタイプを参照できるように、ミックスインをホストクラスによってパラメーター化することも必要です。この2つを混在させようとすると、問題が発生します。正しい構文は私にはわかりません。たとえば、次のコードはg++4.4.1でコンパイルできません。

template <template<class> class... Mixins>
class Host : public Mixins<Host<Mixins>>... {
  public:
    template <class... Args>
    Host(Args&&... args) : Mixins<Host>(std::forward<Args>(args))... {}
};

template <class Host> struct Mix1 {};

template <class Host> struct Mix2 {};

typedef Host<Mix1, Mix2> TopHost;
TopHost *th = new TopHost(Mix1<TopHost>(), Mix2<TopHost>());

エラーあり:

tst.cpp: In constructor ‘Host<Mixins>::Host(Args&& ...) [with Args = Mix1<Host<Mix1, Mix2> >, Mix2<Host<Mix1, Mix2> >, Mixins = Mix1, Mix2]’:

tst.cpp:33:   instantiated from here

tst.cpp:18: error: type ‘Mix1<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’

tst.cpp:18: error: type ‘Mix2<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’

可変個引数テンプレートとCRTPの混合に成功した経験はありますか?

4

1 に答える 1

8

以下はうまくいくようです。Mixins...パラメータパックをインプレースで拡張する継承されたミックスインクラスを追加しました。テンプレートの本体の外側ではHost、のすべてのテンプレートパラメータをHost指定する必要があるためMixins...、目的を果たします。本体の内部では、Hostすべてのテンプレートパラメータを詳しく説明する必要はありません。速記の一種。

#include <utility>

template <template<class> class... Mixins>
class Host : public Mixins<Host<Mixins...>>...
{
  public:
    Host(Mixins<Host>&&... args) : Mixins<Host>(std::forward<Mixins<Host>>(args))... {}
};

template <class Host> struct Mix1 {};
template <class Host> struct Mix2 {};

int main (void)
{
  typedef Host<Mix1, Mix2> TopHost;
  delete new TopHost(Mix1<TopHost>(), Mix2<TopHost>());
}
于 2010-03-17T15:31:45.900 に答える