c++ - 如何在编译时查询一个类的所有基类?

标签 c++ g++ c++11 metaprogramming base-class

std::is_base_of<A,B>::value可以检查一个类 A是一个基类 类 B . 是否也可以向编译器查询一个类的所有基类 B ,例如 base_classes_of<B>返回包含 B 的所有基类的 std::tuple ?

有没有evtl。可以实现此目的的 g++ 中的非标准扩展?

如果这根本不可能,有人知道为什么吗?这听起来像是一个相当基础的 编译器应该很容易获得的信息?

例子:

#include <type_traits>
#include <tuple>

struct A {};
struct B : A {};

static_assert(std::is_base_of<A, B>::value, "A is base of B");
static_assert(! std::is_base_of<B, A>::value, "but B is not base of A");

// now I am looking for something like
// typedef base_classes_of<B>::type B_bases;
// static_assert(std::is_same<B_bases, std::tuple<A>>::value, "all bases of B are: A");

int main() {}

最佳答案

类似的设施 basesdirect_basesN2965 .
至于数据成员,由于数据成员可以是位域,它们的类型特征 有一些微妙之处。
另一方面,基类没有这样的问题。
我认为需要像 bases 这样的编译时查询 在某些情况下,如 N2965 的激励示例中所述。
然而,不幸的是,当前的 C++ 缺少它,据我所知, GCC 和 Clang-C++ 目前似乎没有提供类似的设施......

关于c++ - 如何在编译时查询一个类的所有基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5281103/

相关文章:

c++ - 在结构中的数字常量之前预期的 â,â 或 â...â

c++ - 为什么 std::move( arg ) 改变 arg 参数?

c++ - 如何处理回调注册

c++ - Spirit X3解析器启动状态?

c++ - 两个区间 [a,b] 之间的 double 随机数生成

c++ - imread 命令后 OpenCV 矩阵内存释放

c++ - 有没有办法检查 std::random_device 是否实际上是随机的?

c++ - 在 bb10 上实现后退按钮

c++ - libstdc++ - 不使用 qmake 静态链接

c++ - 抑制来自 gcc init_priority 属性的警告