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

Lin*_*gxi 6 c++ type-traits language-lawyer template-meta-programming c++14

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

基本上,我想要写一个函数模板这样:

template <typename T>
aggregate_wrapper<T> wrap(T&& x);
Run Code Online (Sandbox Code Playgroud)

仅在T聚合类型时启用.

Nic*_*las 4

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

没有这个的一般原因是缺乏明确的需求。即使在包装器的情况下,将其应用于非聚合类型也没有什么坏处,因为统一的初始化语法可以应用于非聚合。您将使所有转换成为非explicit,但这可以通过聪明的元编程/enable_if体操来修复。

对于这样的事情最有用的地方是 in allocator::construct,它允许您使用聚合初始化来构造对象(如果T是聚合),而使用直接构造函数调用,否则(以避免统一初始化的“不统一”部分)。