c++ - 在编译时检查该类是否有 C++ 中的基类

标签 c++ inheritance types std

我想使用 C++ 中的类型实用程序检查类 X 是否具有 ANY 基类。

例如:

class X : public Y
{
}
static_assert(std::has_base_class<X>::value, "") // OK

但是:

class X
{
}
static_assert(std::has_base_class<X>::value, "") // Failed

标准库中是否存在像我想象的 has_base_class 这样的东西?谢谢!

最佳答案

正如评论中提到的,在标准 C++ 中你不能完全做到这一点。从 std 库得到的最接近的是 std::is_base_of ,但它用于测试特定的基类。

但正如前面提到的 here GCC 有 std::tr2::bases (和 std::tr2::direct_bases) 解决了通用“有任何基础”断言的问题。这些来自N2965 proposal不幸的是rejected对于标准 C++。

下面是一个示例代码,展示了如何使用此 GCC 扩展来断言您想要的内容:

#include <tr2/type_traits>

class B {};

class X : public B {};
static_assert(std::tr2::bases<X>::type::empty(),"X");
// doesn't compile because X bases tuple returned is not empty

class Y {};
static_assert(std::tr2::bases<Y>::type::empty(),"Y");

#include <iostream>
using namespace std;

int main() {
  return 0;
}

关于c++ - 在编译时检查该类是否有 C++ 中的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61933319/

相关文章:

c++ - cmake:读取并编译动态生成的 cpp 文件列表

c++ - 输出流文件不添加新行

c# - 接口(interface)继承和属性隐藏麻烦

java - 在java中将int的流转换为char

ruby-on-rails - ActiveRecord 中的浮点型与小数型

c++ - 参数包展开顺序

c++ - 如何通过 MFC 将应用程序设置保存在注册表中?

c++ - 继承和默认构造函数的一些问题

java - 继承和访问指定

haskell - 我试图破解 Haskell,并从 GHC 收到 "Inaccessiable code"错误。这是什么意思?