我有一组实现相同业务方法的类。由于性能原因,我打算使用 CRTP 而不是虚拟调度。但我想保持编码的便利性,将其编码到带有继承和虚拟方法的单个接口(interface)。
是否可以让我的专用类继承自使用 CRTP 保存公共(public)代码的模板化抽象类,以及继承自纯虚拟类,这样我就可以创建每种类型的实例,但让我的客户端代码依赖只在界面上?更好的是,我如何使用 CRTP 为客户端代码提供单一接口(interface),同时具有多个实现?
最佳答案
当然。您可以使用这样的方法,这是完全有效的:
class Interface
{
public:
virtual void doSomething() = 0;
//...
};
template<typename T>
class GeneralImpl : public Interface
{
public:
void doSomething() override
{
auto someDetail = T::somethingStatic();
//...
static_cast<T*>(this)->someMember();
//...
}
}
class SpecificImpl : public GeneralImpl<SpecificImpl>
{
public:
static int somethingStatic()
{
//...
}
void someMember()
{
//...
}
};
int main()
{
std::vector<Interface*> vec;
SpecificImpl instance;
//...
vec.push_back(&instance);
//...
for(auto* inst : vec) {
inst->doSomething();
}
//...
}
关于c++ - 使用带接口(interface)的 CRTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40909907/