3

假设我有:

struct Magic {
  Magic(Foo* foo);
  Magic(Bar* bar);
};

有没有办法让 Magic 成为模板,并定义模板类 st

typedef Magic<FooPolicy, ...> MagicFoo;
typedef Magic<BarPolicy, ...> MagicBar;
typedef Magic<..., ...> MagicNone;
typedef Magic<FooPolicy, BarPolicy> MagicAll;

st MagicFoo & MagicAll 有 Foo* 构造函数;MagicBar & MagicAll 具有 Bar* 构造函数;和 MagicNone 既不是 Foo* 也不是 Bar* 构造函数?

基本上我希望构造函数存在或不存在基于策略类。

4

3 回答 3

4

您可以编写一个接受任何内容的构造函数,然后委托给策略提供的任何内容:

// "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);
于 2010-02-26T22:47:44.927 回答
0

这看起来像是子类的应用程序,而不是策略类。 MagicFoo并且MagicBar似乎想要成为 的子类Magic,它本身可能有一个protected构造函数。

于 2010-02-26T22:43:07.167 回答
-1

您可以拥有所有策略的模板定义和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;
}
于 2010-02-26T22:44:01.503 回答