有没有一种方法只允许对C ++中的最终类进行继承

时间:2020-06-25 20:15:32

标签: c++ compile-time

我有一个基类,希望通过标记为final的类(或本身不是从其继承的类)仅从 继承。

基本思想是我想在编译时禁止其他超类从该类继承。

例如:

class O { /* Some compile time check here */ };
class A final : O {}; // OK
class B : O {}; // Not OK

我知道这可以在A类中通过使用类似的方法来完成:

if ( std::is_base_of<O,A>::value ) static_assert( std::is_final<A>::value );

但是这需要在每个单独的类中编写。我希望这张支票在O类中(但我不知道那是否有可能)。

谢谢

1 个答案:

答案 0 :(得分:5)

您可以同时使用CRTP和std :: is_final。

#include <type_traits>

template <typename CRTP>
class Base {
public:
    ~Base() {
        static_assert( std::is_final<CRTP>::value );
    }
};

// This will trip a compile time static_assert when the class is instantiated.
class Derived : Base<Derived> { 
};

class DerivedAndFinal final : Base<DerivedAndFinal> {
};

int main() {
    Derived d;
    (void)d;
    DerivedAndFinal daf;
    (void)daf;
}