【问题标题】:How to check whether T is an aggregate type?如何检查 T 是否为聚合类型?
【发布时间】:2016-05-01 20:47:44
【问题描述】:

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

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

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

仅当T 为聚合类型时才启用。

【问题讨论】:

  • 我想不出is_aggregate 的任何实际应用。例如。它对序列化没有帮助。
  • 如果您正在寻找可以告诉您何时的类型特征,例如memcpy 是安全的,那么你想要std::is_trivially_copyable
  • @Cheersandhth.-Alf 我想为this写一个wrap()函数模板,只有当T是一个聚合类型时才启用。
  • std::is_objectstd::is_compound 不能满足您的需求吗?
  • @mindriot 不。这是关于初始化语法的。聚合类型支持{},但不支持()

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


【解决方案1】:

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

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

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

【讨论】:

  • 再想一想,像这样写wrap() 可能不是一个好主意。给定一个聚合,你无法真正判断用户是想创建一个 aggregate_wrapper 还是仅使用 wrap(x) 的其他东西。
猜你喜欢
  • 2016-10-15
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 2014-11-03
相关资源
最近更新 更多