C++ 有没有一种方法只允许C++;

C++ 有没有一种方法只允许C++;,c++,compile-time,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

我有一个基类,我只想由标记为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 );
if(std::is_base_of::value)static_assert(std::is_final::value);
但这需要在每个类中编写。我希望这张支票是O类的(但我不知道这是否可能)


谢谢

您可以同时使用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;
}
#包括
模板
阶级基础{
公众:
~Base(){
静态断言(std::is_final::value);
}
};
//这将在实例化类时触发编译时静态_断言。
派生类:基{
};
派生类和最终类:基本类{
};
int main(){
导出d;
(d)无效;
衍生和最终daf;
(无效)daf;
}

将此放在类之前:
//仅通过最终类从O继承
我不明白为什么需要这样做。子类有什么问题吗?请忘记Java如果你认为你需要它,你可能错过了一些东西或做出了一些糟糕的设计选择。@Dimitrobuche我很难想象任何与此相关的场景,但我想大多数事情都是可能的。请注意,不是类声明,但是它的实例声明会导致编译时错误。而且,您可能希望使析构函数成为虚拟的。这当然是有争议的。像C++中的大多数其他东西一样,可以通过专门化析构函数轻松绕过这一点。但是,想要这个功能又完全是胡说八道?我们可能只想警告开发人员,以防他们出错。通过删除断言或执行
#define static_assert(x)
,可以绕过此操作。没有人真的在监督任何人。@Zebrafish什么都没有,它只是抑制关于未使用变量的警告。