与 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() {}
最佳答案
类似的设施 bases
和 direct_bases
在
N2965 .
至于数据成员,由于数据成员可以是位域,它们的类型特征
有一些微妙之处。
另一方面,基类没有这样的问题。
我认为需要像 bases
这样的编译时查询
在某些情况下,如 N2965 的激励示例中所述。
然而,不幸的是,当前的 C++ 缺少它,据我所知,
GCC 和 Clang-C++ 目前似乎没有提供类似的设施......
关于c++ - 如何在编译时查询一个类的所有基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5281103/