聚合类相对于常规类的优势[重复]
Posted
技术标签:
【中文标题】聚合类相对于常规类的优势[重复]【英文标题】:Advantages of aggregate classes over regular classes [duplicate] 【发布时间】:2022-01-14 01:12:58 【问题描述】:在我的用例中,我需要使用初始化列表来初始化一个类变量。我了解到聚合类是一个只有用户定义的数据成员的类。
聚合的好处是我们可以像这样使用初始化列表
struct fileJobPair
int file;
int job;
;
fileJobPair obj = 10, 20;
但是如果我给它添加一个构造函数,这个类就不再是一个聚合了
struct fileJobPair
int file;
int job;
fileJobPair()
file = job = 0;
fileJobPair(int a, int b)
file = a;
job = b;
;
但我看到我们对聚合类的初始化列表优势仍然可以在这里使用。
fileJobPair obj = 10, 20;
所以我的问题是,如果普通课程可以实现相同的目标,为什么我们甚至需要一个聚合。聚合的优点和实际用例是什么。
【问题讨论】:
当你需要与 C 互操作时。 我认为question 是一本好书。 【参考方案1】:聚合有什么优点<...>
与“普通”类不同,聚合类型:
-
具有预定义的“构造函数”(您的示例)
结构化绑定不需要类似元组的接口样板:
struct int field1, field2; aggregate;
auto&& [_1, _2] = aggregate;
-
有指定的初始化器:
Aggregate.something = 42, .something_else = "whatever";
也许还有一些我没有想到的事情。
聚合的<...>现实生活用例是什么
例如由于#2,您可以(反)序列化它们而无需样板,另请参阅Boost.PFR。您可以轻松地合并它们(如元组)、“foreach”它们的字段等。
#3 的示例:将大量 Builder 模式代码替换为
struct Foo
struct Builder std::string_view a, b, c; ;
constexpr Foo(Builder); // TODO
example.a = "cannot set a field twice", .c = "can skip fields";
普通班也能达到同样的效果
如您所见,它不能或需要额外的样板。
【讨论】:
以上是关于聚合类相对于常规类的优势[重复]的主要内容,如果未能解决你的问题,请参考以下文章
(有没有)python socketserver 相对于常规套接字对象的性能优势?