[英]Limit inheritance of classes to specific library in C++
我试图将 inheritance 的 c++ class 限制在同一个库中,同时允许它在其他库中实例化。
用例是我有一些代码需要具有实时能力(使用特殊标志和中毒代码编译)并且需要使用/连接到非 RT 代码。 但是,我需要绝对确保在 RT 代码中不能调用任何非 RT 代码。 因此,我必须使用库:一个支持 RT,一个不支持(取决于 RT 库,可能会使用其中的代码)。
现在,我有一些抽象类,我只想从 RT 库内部继承它们。 是否可以从RT库外定义的类中禁止那些ABC的inheritance?
到目前为止我想出的(没有它工作)是定义一个宏,它使类最终在 RT 代码之外和一个使用 std::conditional 的模板化基础 class
class BaseA REALTIME_FINAL
{
virtual void foo() = 0;
}
template <bool allow = REALTIME_TRUE>
class BaseB : : virtual public std::conditional<allow, std::true_t, std::nullptr_t>::type
{
virtual void foo() = 0;
}
虽然这两种方法都禁止抽象基类中的 inheritance,但它也使得非 RT 库无法在 RT 库中调用或实例化(甚至包含头文件)从它派生的任何类。
您可以更简单地解决这个问题,方法是将您的实时代码移动到它自己的库中,并使用它自己的 header 文件,并在不依赖于您的非实时库的情况下构建它。
将您的实时和非实时标头放入不同的目录,如果您的实时代码构建为共享库,请使用 linker 选项禁止该库中的未定义符号。
然后,您所要做的就是记住不要在实时库的构建配置中添加系统的-Inon-realtime
或-lnon-realtime
等价物。
你需要认真思考的一件事是——你今天可以解决这个问题,但明天实习生会进行更改,这些更改会潜入你的代码中,这些代码可以编译,但会在你的客户手中中断。 因此,我非常愿意采用一种不留任何想象余地的解决方案。
我的首选方法始终是将库与 C API 分开。这保证了 C++ 功能不会被篡改,编译器经常会操纵这些功能。
我更经常使用它来封装使用旧的 ABI(C++11 之前的版本)编译的代码,不幸的是,这在某些供应商中仍然很常见。
这也保证我可以从 CD/CI 的角度从其他脚本语言(如 Python、Java、Rust)更轻松地访问这些功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.