我来自Java,那里大量使用builder模式,e.g.

Foo foo = new FooBuilder()
    .setBar(43)
    .setBaz("hello, world!")
    .enableCache(true)
    .build();

例如,Automapper是一个流行的库,它通过Java注释生成这种模式.

我没有看到任何这样的C++库——只有GIST和博客文章在线提供了示例即席实现.

缺少库是否意味着编译器模式在C++中不是首选模式?那么,另一种或首选的习语是什么呢?

也许这有助于描述我真正想要的东西.我喜欢builder模式提供给我的语法,例如,如果我可以设置20个字段(e.g.个大型配置),但可能只设置4个字段,或者可以设置全部20个字段,而不必为每种情况创建显式构造函数.

推荐答案

一种常见的模式是聚合初始化:

Foo foo = {
    .bar=43,
    .baz="hello, world!",
    .enableCache=true,
};

注意,这里使用的指定初始化器是在C++20中引入的.在此之前,只能按位置初始化子对象.

另一种模式在没有指定初始化器的情况下很常见,即先初始化值,然后分配数据成员:

Foo foo = {};
foo.bar = 43;
foo.baz = "hello, world!";
foo.enableCache = true;

使用这两种模式都不需要使用库.

Java相关问答推荐

gitlab ci不会运行我的脚本,因为它需要数据库连接'

BiPredicate和如何使用它

查找最大子数组的和

Android Studio—java—在onBindViewHolder中,将断点和空白添加到BackclerView中

现场观看Android Studio中的变化

JavaFX Maven Assembly插件一直打包到错误的JDK版本

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

基于调车场算法的科学计算器

生成桥方法以解决具有相同擦除的冲突方法

如何在Java记录中设置BigDecimal类型属性的精度?

Jenv-相同的Java版本,但带有前缀

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

为什么这种递归会有这样的行为?

Java Flux中的延迟增加

如何使JOOQ渐变脚本不重新创建表未更改的类?

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

这是JavaFX SceneBuilder的错误吗?

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

仅允许使用 Spring Boot 3 从本地主机