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

时间:2016-01-25 13:56:47

标签: c++ language-lawyer c++14 template-meta-programming typetraits

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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