我有一个基类,希望通过标记为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类中(但我不知道那是否有可能)。
谢谢
答案 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;
}