我知道std::is_pod
。但它检查的不仅仅是聚合类型。或者,std::is_pod
是我们能做的最好的事情吗?
基本上,我想为this编写一个函数模板:
template <typename T>
aggregate_wrapper<T> wrap(T&& x);
仅在T
为聚合类型时启用。
答案 0 :(得分:4)
无法合成is_aggregate
模板。 C ++ 14元编程技术无法检测某些参与聚合初始化的规则(它们需要反射支持)。
没有这个的一般原因是缺乏明确的需要。即使在your wrapper的情况下,在将其应用于非聚合类型时也几乎没有损害,因为统一初始化语法可以应用于非聚合。您将完成所有转换 - explicit
,但这可以通过聪明的元编程/ enable_if
体操来修复。
对于这样的事情最有用的地方是allocator::construct
,如果T
是聚合,那么允许你使用聚合初始化来构造对象,否则使用直接构造函数调用(到躲避统一初始化的“不统一”部分。