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

C++ 如何检查T是否为聚合类型?,c++,language-lawyer,c++14,template-meta-programming,typetraits,C++,Language Lawyer,C++14,Template Meta Programming,Typetraits,我知道std::is_pod。但它检查的不仅仅是聚合类型。或者,std::pod是我们能做的最好的吗 基本上,我想为以下内容编写一个函数模板: 模板 集料包装(T&x); 只有当T是聚合类型时,才会启用该属性。无法合成是聚合的模板。C++14元编程技术无法检测是否有东西参与聚合初始化的规则(它们需要反射支持) 没有这样做的一般原因是缺乏明确的需求。即使在的情况下,将其应用于非聚合类型也没有什么害处,因为统一的初始化语法可以应用于非聚合。您将使所有转换都非显式,但这可以通过巧妙的元编程/启用(如

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

基本上,我想为以下内容编写一个函数模板:

模板
集料包装(T&x);

只有当
T
是聚合类型时,才会启用该属性。

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

没有这样做的一般原因是缺乏明确的需求。即使在的情况下,将其应用于非聚合类型也没有什么害处,因为统一的初始化语法可以应用于非聚合。您将使所有转换都非显式
,但这可以通过巧妙的元编程/
启用(如果
体操)来解决


这样做最有用的地方是
allocator::construct
,如果
T
是一个聚合,那么它允许您使用聚合初始化来构造对象,否则使用直接构造函数调用(以避开统一初始化中的“不统一”部分).

我想不出一个
是聚合的
的任何实际应用。例如,它对序列化没有帮助。如果您正在查找类型特征,该类型特征告诉您例如
memcpy
何时是安全的,那么您需要。@cheers-sandhth.-Alf我想为其编写一个
wrap()
函数模板,只有当
T
是聚合类型时,才会启用此选项。Do
std::is_object
std::is_component
不满足您的需要吗?@mindrio No。这是关于初始化语法的。聚合类型支持
{}
,但不支持
()
。再想一想,像这样编写
wrap()
可能不是个好主意。给定一个聚合,您无法真正判断用户是想要制作一个
aggregate\u包装器
,还是仅仅使用
wrap(x)
来制作其他东西。
template <typename T>
aggregate_wrapper<T> wrap(T&& x);