3

std::is_base_of<A,B>::value可以检查一个类是否是 class的A基类。是否也可以在编译器中查询一个类的所有基类 ,例如,返回一个包含所有基类的 std::tuple 之类的东西?BBbase_classes_of<B>B

有没有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() {}
4

3 回答 3

2

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

于 2011-03-12T23:54:29.403 回答
1

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

干杯&hth.,

于 2011-03-12T08:30:38.447 回答
1

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

于 2011-03-12T10:00:24.610 回答