如何保护CRTP不提供错误的超类?

时间:2015-02-16 19:30:26

标签: c++ c++11 crtp static-assert

curiously recurring template pattern中,我们写了

template <class Derived>
class Base {
};

class Derived : public Base<Derived> {
};

使代码强大的另一个复制粘贴遗漏的好方法是什么,以便以下代码段引发编译时错误:

class AnotherDerived : public Base<Derived> {
};

我正在使用Visual C ++ 2013。

2 个答案:

答案 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>,但这是你可以去的。