在curiously recurring template pattern中,我们写了
template <class Derived>
class Base {
};
class Derived : public Base<Derived> {
};
使代码强大的另一个复制粘贴遗漏的好方法是什么,以便以下代码段引发编译时错误:
class AnotherDerived : public Base<Derived> {
};
我正在使用Visual C ++ 2013。
答案 0 :(得分:4)
将Base
的析构函数设为私有,然后将Derived
设为Base<Derived>
的朋友:
template <class Derived>
class Base {
private: ~Base() = default;
friend Derived;
};
class Derived : public Base<Derived> {
};
这实际上并没有做到
class AnotherDerived : public Base<Derived> {
};
非法,但实际构建AnotherDerived
的任何尝试都将失败。
答案 1 :(得分:1)
你可以static_assert
论证来自Base<Argument>
,但这是你可以去的。