1

私はこれらのクラスを持っています:

class A{};
class B{};
class C : public A{};
class D : public A, public B{};

次のようなテンプレート関数を作成したいと思います。

template<typename T>
void f(T* arg);

そしてそれのために2つの専門分野を作るために:

  • Tが継承を使用しない場合または単一の継承を使用する場合の1つ
  • Tが多重継承を使用する場合の1つ

f_specialization1()最初のケースであるとしましょうf_specialization2()(私はちょっと同じ名前でなければならないことを知っています、これはちょうど便利な慣習です)。私はこの振る舞いが欲しい:

A a;
B b;
C c;
D d;

f(&a);//here f_specialization1 is called
f(&b);//here f_specialization1 is called
f(&c);//here f_specialization1 is called
f(&d);//here f_specialization2 is called

この動作を実現することは可能ですか?

4

1 に答える 1

1

私はあなたの意図を知りませんが、より良い設計ソリューションを得るために意図した動作を質問に含める必要があることに同意しますが、要求を達成するための簡単なメカニズムは、多重継承されたすべてのクラスも継承する必要がある空のインターフェイスを作成することですその MultipleInheritance の「インターフェイス」から、そしてそのために特化します。

class MultipleInheritance
{
protected:
    MultipleInheritance() {}
};


class A{};
class B{};
class C : public A{};
class D : public A, public B, public MultipleInheritance {};

template<>
void f(MultipleInheritance* arg);

template<typename T>
void f(T* arg);

ただし、個人的には、設計の制約によっては、この時点で再設計が非常に望まれると思います。この関数の特殊化を選択するために、そうでなければ役に立たない型が使用されるため、実際にはあまり有用なことはできません。

于 2013-01-28T17:37:10.593 に答える