【发布时间】:2018-07-31 10:19:22
【问题描述】:
我有一个类将作为(许多)其他类的基类。每个派生类的逻辑都围绕单个函数略有不同,该函数本身将是一组外部函数中的一个。我的目标是有一些高效、清晰的东西,并且会导致每个新派生类的附加代码量最少:
这是我想出的:
// ctor omitted for brevity
class Base
{
public:
void process(batch_t &batch)
{
if (previous) previous->process(batch);
pre_process(batch);
proc.process(batch);
post_process(batch);
}
protected:
// no op unless overridden
virtual void pre_process(batch_t &batch) {}
virtual void post_process(batch_t &batch) {}
Processor proc;
Base* previous;
}
- 公开遵循设定模式的“流程”功能
- 函数的核心逻辑由“处理器”类中的一个拖放定义
- 允许通过两个虚函数修改此模式,这两个虚函数定义了在调用 Processor::proc 之前/之后完成的额外工作
- 有时,这个对象有一个指向另一个必须在它之前做其他事情的句柄,为此我有一个指针'previous'
这个设计看起来不错还是有一些我没有考虑到的明显漏洞?或者在这种情况下还有其他常见的模式吗?
【问题讨论】:
-
如果您不在任何地方使用
DERIVED,为什么要使用 CRTP? -
我会在其他地方做,我只是发布了一个与扩展流程功能问题相关的班级的最小示例
-
您应该删除 CRTP,或者修改示例以向我们展示它是如何使用的。我不认为我们可以为这个问题添加任何有用的东西。
-
每个
Base<Foo>都是一个不同的类。您不能将Base<Foo1>和Base<Foo2>绑定到同一个引用或指针。那么 CRTP 真正服务的目的是什么?我认为 geza 是对的。 -
啊,我明白了,在这种情况下,我可以废弃 CRTP 并只使用 vtable。我实际上希望 Processor::proc 调用无论如何都会主导额外的开销。忽略 CRTP 部分,其余的设计看起来是否合理?
标签: c++ oop design-patterns polymorphism