假设我有一个像这样的基类:
class Abstract {
public:
/* This type should be the deriver of this class */
virtual DerivedType foo(void) = 0;
};
我希望
DerivedType
取决于谁是从此类派生的。实际上,我希望DerivedType
成为Derives
中的Abstract
的类型。我意识到我可以做这样的事情:
template<typename der_t>
class Abstract {
public:
virtual der_t foo(void) = 0;
};
然后应该这样使用:
class Derived : public virtual Abstract<Derived> { };
不幸的是,没有办法强制某人在模板中传递正确的类型。那是有人可以做到的:
class Derived : public virtual Abstract<int> { };
那么,有没有更好的方法可以执行此操作,或者有什么方法可以强制某人传递正确的参数?
最佳答案
CRTP的通常技巧是拥有一个私有(private)构造函数,只有传入的类才能通过friend
指令进行访问:
template <class Derived>
struct Crtp {
private:
friend Derived;
Crtp() = default;
};
它不是完美的,但是要防止错误。
注意:
static_assert
并不是一个实际的解决方案,因为在实例化Crtp
时,Derived
仍不完整,无法检查基类。关于c++ - 奇怪的继承模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37528331/