【问题标题】:C++: Smart Pointers & Fluent Design Pattern with ReferencesC++:带有引用的智能指针和流畅的设计模式
【发布时间】:2026-01-30 07:00:01
【问题描述】:

在被高级语言宠坏了一辈子之后,我正在努力学习 C++。

我想在课程中使用fluent design pattern,但我担心我会在某处犯错并牺牲性能。

假设我有一个类Builder,它有一些成员属性和方法。它的所有方法看起来都像这样:

Builder &doSomething(SomeTypeThatCouldBeAClassOrAPrimitive &thing)
{
    // do stuff, such as
    // modify a class member
    memberThing = "something";
    
    return *thing;
} 

并说我是这样使用它的:

unique_ptr<Builder> builder(new Builder());

builder->doSomething(someVal)
        .doAnotherThing(someOtherVal)
        .doAFinalThing(someOtherOtherVal);

仅从提供的代码来看,是我做错了什么,还是可以更有效地完成某些事情?

如果我需要提供更多信息,请告诉我。

【问题讨论】:

  • 正如 cdhowie 所指出的,您的实现是正确的(即使应用程序可能过于复杂)。但是,仅根据您问题的上下文,我建议您不要在心理上将构建器模式与流畅的界面等同起来。也许您已经了解其中的区别,但我只是认为值得一提。
  • @Nerdizzle 说得好,它们绝对是一回事。这恰好是第一个出现在我脑海中的例子。构建器可能也是很多人第一次使用 Fluent 风格的 API。

标签: c++ c++11 fluent c++20


【解决方案1】:

这里没有错误,但也不需要在堆上分配Builder 对象。请考虑:

Builder builder;

builder.doSomething(someVal)
       .doAnotherThing(someOtherVal)
       .doAFinalThing(someOtherOtherVal);

您甚至可以使用临时的 Builder 并完全删除该变量:

Builder{}.doSomething(someVal)
         .doAnotherThing(someOtherVal)
         .doAFinalThing(someOtherOtherVal);

【讨论】:

  • 考虑到构建器本身可能不需要活很长时间。