缶C ++ポリシーのクラスは、コンストラクタの存在/非存在を指定するために使用されますか?
質問
私が持っていると仮定します:
struct Magic {
Magic(Foo* foo);
Magic(Bar* bar);
};
マジックにテンプレートを作成し、テンプレートクラスはs.t定義する方法があります。
typedef Magic<FooPolicy, ...> MagicFoo;
typedef Magic<BarPolicy, ...> MagicBar;
typedef Magic<..., ...> MagicNone;
typedef Magic<FooPolicy, BarPolicy> MagicAll;
s.t。 MagicFoo&MagicAllはFooの*コンストラクタを持っています。 MagicBar&MagicAllはバー*コンストラクタを持っています。そしてMagicNone NASどちらのFoo *やバー*コンストラクタ?
基本的に私は、ポリシークラスに基づいていない存在コンストラクタが存在する場合、またはます。
解決
あなたは何を受け入れるコンストラクタを記述し、その後、ポリシーが提供するものは何でもに委任することができます:
// "Tag" and "No" are used to make the class/function unique
// (makes the using declarations work with GCC).
template<int Tag>
struct No { void init(No); };
template<typename P1 = No<0>, typename P2 = No<1>, typename P3 = No<2> >
struct Magic : P1, P2, P3 {
template<typename T>
Magic(T t) {
init(t);
}
private:
using P1::init;
using P2::init;
using P3::init;
};
引数を転送したら、さて、コンパイラは、ポリシーの中で最高の試合を把握します。
struct IntPolicy { void init(int) { std::cout << "called int!"; } };
struct FloatPolicy { void init(float) { std::cout << "called float!"; } };
Magic<IntPolicy, FloatPolicy> m(0), n(0.0f);
他のヒント
のサブクラスではなく、ポリシークラスのアプリケーションのようなそのルックス。 MagicFoo
とMagicBar
はMagic
コンストラクタを持っているかもしれません自体protected
、のサブクラスになりたいように見える。
あなたはすべてのポリシーのテンプレート定義とMagicNone
のための専門を持つことができます。例は次のようになります。
template<class T>
struct Magic {
Magic(T *o) {}
};
struct None {};
// specialize for MagicNone
template<> struct Magic<None> {
Magic() {} // default ctor
};
int main()
{
int a = 32;
Magic<int> mi(&a);
Magic<None> m;
}
所属していません StackOverflow