gpt4 book ai didi

c++ - 我可以将 CRTP 与多个派生类一起使用,并以多态方式使用它们吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:30 24 4
gpt4 key购买 nike

我有这样的类层次结构:

template <class Type>
class CrtpBase
{
protected:
Type& real_this()
{
return static_cast<Type&>(*this);
}
};

template <class ChildType>
class Base : CrtpBase<ChildType>
{
public:
void foo()
{
this->real_this().boo();
}
};

class Derived1 : public Base<Derived1>
{
public:
void boo { ... }
};

class Derived2 : public Base<Derived2>
{
public:
void boo { ... }
};

问题是,我想以这种方式使用我的类:

std::vector<Base*> base_vec;
base_vec.push_bach(new Derived1());
base_vec.push_bach(new Derived2());
.........
base_vec[0]->foo();

但这是不可能的,因为所有派生类的基类都是不同的(实际上 Base 根本不是一种类型,它是模板)。那么,有没有一种方法可以将 crtp 与多个派生类一起使用以及多态性?

最佳答案

确实有,你还需要添加合适的非模板基类:

class AbstractBase
{
public:
virtual ~AbstractBase() {}

virtual void foo() = 0;
};


template <class ChildType>
class Base : CrtpBase<ChildType>, public AbstactBase
{
void foo() override { this->real_this().boo(); }
};

然后,将 vector 声明为 std::vector<AbstractBase*> .

这确实引入了动态分派(dispatch)的开销(您可能试图通过使用 CRTP 来避免),但动态分派(dispatch)是在 C++ 中获得运行时多态性的唯一方法。

不过,它仍然是有益的。例如,如果执行 foo由所有派生类共享,但调用许多不同的 boo风格的函数(每个派生类都有不同的实现),您只需在调用时支付一次动态调度成本 foo ,然后是 foo 内的所有调用静态调度,CRTP 风格。

另一方面,如果它只是一次调用 boo类似函数 foo , 你也可以制作 boo虚拟,放非虚拟foo进入基地,从而摆脱CRTP。成本将是相同的:非虚拟调度 (foo) 和虚拟调度 (boo)。


旁注,您应该强烈考虑将智能指针存储在 std::vector 中; 拥有原始指针是不好的做法。

关于c++ - 我可以将 CRTP 与多个派生类一起使用,并以多态方式使用它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36642453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com