假设我有这样一个基类:
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> { };
那么有没有更好的方法来做到这一点,还是有办法强迫某人传递正确的参数?
答案 0 :(得分:2)
CRTP的常用技巧是拥有一个私有构造函数,只有传入的类可以通过friend
指令访问:
template <class Derived>
struct Crtp {
private:
friend Derived;
Crtp() = default;
};
它并不完美,但可以防止错误。
注意:static_assert
不是一个实际的解决方案,因为在实例化Crtp
时Derived
仍然不完整,并且无法检查基类。< / p>