如何在编译时查询类的所有基类?

时间:2011-03-12 06:54:01

标签: 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() {}

3 个答案:

答案 0 :(得分:2)

提出了类似的工具basesdirect_bases N2965
对于数据成员,由于数据成员可以是位字段,因此它们的类型特征 有一些微妙之处 另一方面,基类没有这样的问题 我认为有一些编译时查询需求,如bases 在某些情况下,如N2965的激励示例中所述 然而,不幸的是,目前的C ++缺乏它,据我所见, GCC和Clang-C ++目前似乎没有提供类似的设施......

答案 1 :(得分:1)

不,它在标准C ++中是不可能的,但是出于预期目的,您可以使用单独的断言,每个基类需要存在一个(或者用类型列表包装)。

干杯&amp;第h。,

答案 2 :(得分:1)

不可能在C ++程序中查询给定类型的基类型 - 实际上不可能查询C ++程序的任何内容....但是你可以编写一个元谓词来查询已知类型针对已知类型的类型列表(或参数包)(反之亦然)并在编译类型生成true或false类型 - 它只是递归地将std::is_base_of元谓词应用于参数包中的所有类型并累积结果。这是我能想到的唯一方法。我可以旋转一些代码,但我怀疑这是你真正想要的。真正的问题是:为什么你需要这样做,或者更好的为什么你需要在C ++中使用它?