具有实例化模板的切换枚举的工厂

krl*_*mlr 5 c++ templates design-patterns factory c++03

我在代码库的各个位置都有以下层次结构模式:

enum DerivedType {
    A, B, C };

class Base {
public:
  static Base* Create(DerivedType t);
};

template <DerivedType T>
class Derived : public Base {
};
Run Code Online (Sandbox Code Playgroud)

该方法返回类、或 Create的新对象,具体取决于其参数:Derived<A>Derived<B>Derived<C>

Base* Base::Create(DerivedType t) {
  switch (t) {
  case A: return new Derived<A>;
  case B: return new Derived<B>;
  case C: return new Derived<C>;
  default: return NULL;
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是有很多这样的层次结构,基本上到处都有Base -> Derived相同的复制粘贴实现。Create()有没有一种优雅且易于理解的方法来避免重复?

Wal*_*ter 1

你可以把它做成模板

template<typename Base, typename Derive, template<Derive> class Derived>
Base* Base::Create(Derive t) {
  switch (t) {
  case Derive::A: return new Derived<Derive::A>;
  case Derive::B: return new Derived<Derive::B>;
  case Derive::C: return new Derived<Derive::C>;
  default: return nullptr;
  }
}
Run Code Online (Sandbox Code Playgroud)

但这假设只有A、 、BCin struct enum Derive