4

複数の継承と仮想継承を回避するために、テンプレート継承を使用することを選択しました。私の目標は、さまざまな子(4世代または5世代、または私が制御しない継承)に、派生するものに関係なく、共通の関数呼び出しを持たせることです。

私の解決策は、テンプレートの継承を次のように挿入することです。

template <typename BASE>
class common_call : public BASE {
public:
    void foo() { /*implementation independent of base*/ }
};

class child1 : public common_call <base1> {};
class child2 : public common_call <base2> {};

これには、baseのコンストラクターを呼び出すという問題があります。クラスbase1とbase2(私が作成したものではありません)には、初期化リストで呼び出す必要のある異なるコンストラクターがあります。common_callテンプレートはこれらのコンストラクターについて何も知りませんが、子クラスは現在直接継承しているので知っています。

私がこれを行う方法はありますか?

class child3 : public common_call<base3>{
public:
    child3(param1, param2) : base3(param2) {/*do things here*/}
};

可能であれば、ベースのタイプごとに部分的なテンプレートの特殊化を行わないようにしています。

4

1 に答える 1

2

common_call次のような可変個引数テンプレートを使用してテンプレート化されたコンストラクターを指定する場合:

template <typename BASE>
class common_call : public BASE 
{
public:
    // C++11 variadic templates to define whole range of constructors
    template<typename... Args>
    common_call(Args&&... args)
    :
        BASE(std::forward<Args>(args)...)
    {}

    void foo() { /*implementation independent of base*/ }
};

common_call次に、任意のテンプレート引数(たとえば)を使用して派生し、base3そのクラスが定義したコンストラクターを呼び出すことができます。

class child3
:
    public common_call<base3>
{
public:
    child3(Type1 param1, Type2 param2)
    :
        common_call(param2), // call constructor overload with 1 parameter of Type2
        t1_(param1)          // initialize t1_ member
    {}

private:
    Type1 t1_;
};
于 2012-09-19T11:20:47.117 に答える