如何检查 T 是否为聚合类型?

How to check whether T is an aggregate type?

我知道 std::is_pod。但它检查的不仅仅是聚合类型。或者,std::is_pod 是我们能做到的最好的吗?

基本上,我想为this写一个函数模板:

template <typename T>
aggregate_wrapper<T> wrap(T&& x);

仅在 T 为聚合类型时启用。

无法合成is_aggregate模板。 C++14 元编程技术无法检测某些事物是否参与聚合初始化的规则(它们需要反射支持)。

没有这个的一般原因是缺乏明确的需要。即使在 your wrapper 的情况下,将其应用于 non-aggregate 类型也几乎没有 危害 ,因为统一的初始化语法可以应用于 non-aggregates。您将使所有转换成为非 explicit,但这可以通过巧妙的元编程/enable_if 体操来解决。

这种东西最有用的地方是 allocator::construct,如果 T 是一个聚合,它允许您使用聚合初始化来构造对象,否则使用直接构造函数调用(为了避开统一初始化的 "not uniform" 部分)。