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()有没有一种优雅且易于理解的方法来避免重复?
你可以把它做成模板
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、 、B和Cin struct enum Derive。
| 归档时间: |
|
| 查看次数: |
1292 次 |
| 最近记录: |