【问题标题】:Check if the class has any base class in C++ in compile time在编译时检查该类是否具有 C++ 中的任何基类
【发布时间】:2020-05-21 11:18:06
【问题描述】:

我想使用 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 的东西?谢谢!

【问题讨论】:

  • 这似乎是 XY 问题,您为什么需要这些信息?顺便说一句,你想要的目前是不可能的
  • 您可以检查特定的基类,但如果该类有任何一般情况,则不能。
  • 你可以检查can-be-converted-to-single-type关系,如果足够接近的话。
  • @super 即使这样,基类也必须是公共的。
  • @lorro gcc 似乎不同意。

标签: c++ inheritance types std


【解决方案1】:

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

但正如提到的here GCC 有std::tr2::bases(和std::tr2::direct_bases)可以解决您对通用“有任何基础”断言的问题。这些来自N2965 proposal,不幸的是rejected for std 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2022-07-06
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多