5

私は最近、コンストラクターの問題に取り組みました。この問題では、互いに装飾するさまざまな mixin クラス (および最上位のホスト クラス) が異なるコンストラクター シグネチャを持っています。結果の装飾されたクラスで単一のコンストラクターを維持し、init 関数を追加せずに、次の解決策を見つけました。mixin クラスに課される唯一の制限は、そのコンストラクターが複数のパラメーターを受け取る場合、それらはすべて単一のタプルにカプセル化する必要があるということです。(このコードを g++ でコンパイルするには、-std=c++0x フラグが必要です)

#include <boost/tuple/tuple.hpp>

// Base class for all mixins
struct Host {
    float f_;
    int i_;

    Host(float f, int i) : f_(f), i_(i) {}
};

// First mixin--constructs with 1 parameter
template <class B>
struct M1 : public B {
    char c_;

    template <class... A>
    M1(char c, const A&... a) : B(a...), c_(c) {}
};

// Second mixin--constructs with 3 parameters
template <class B>
struct M2 : public B {
    double d_;
    short s_;
    const char* p_;

    template <class... A>
    M2(boost::tuple<const char*, double, short> t, const A&... a)
    : B(a...), p_(t.get<0>()), d_(t.get<1>()), s_(t.get<2>()) {}
};


int main() {
    // ctor parameters go in this order, from most derived to base:
    M2<M1<Host>> tst(boost::make_tuple("test", 46.1, (short)-1), (char)5, 4.2f, 2);
  return 0;
}

私の質問は次のとおりです
。1) C++0X でこの問題を解決するためのより優れた、より洗練された方法はありますか?
2) 具体的には、タプルは本当に必要ですか?

4

2 に答える 2

4

タプルのようなものが必要になるのは、ミックスインのアリティが異なる複数のコンストラクターがある場合 (したがってあいまいさがある場合) だけです。

そうでない場合は、通常どおり mixin のパラメーターを処理できます。

template <class... A>
M2(const char* p, double d, short s, const A&... a)
  : B(a...), p_(p), d_(d), s_(s) {}
于 2010-07-31T18:07:53.903 に答える
0

基本構造体を作成し、それを M1 と M2 のコンストラクター パラメーターとして渡すと、b のコピー コンストラクターを呼び出すことができます。

M2(const B &b, ....) : B(b), ....

本当に継承が必要ですか?構成はよりエレガントで保守しやすくなります。

于 2010-07-31T17:35:58.593 に答える