c++ - 如何使用折叠表达式调用成员函数链

标签 c++ c++20 fold-expression

我有一个像这样的构建器类

class Builder
{
public:
   Builder (SomeData someData);
   
   template <class FooType, class... FooConstructorArgs>
   Builder&& addFoo (FooConstructorArgs&&... args) &&
   {
      addInternal (new FooType (std::forward<FooConstructorArgs> (args)...);
      return std::move (*this);
   }
//...
}

现在有一个这样的函数

std::string createUuid();

template <std::constructible_from<std::string> FooType>
void bar (SomeData data)
{
   auto builder = Builder (data).addFoo<FooType> (createUuid());
   
   // do something fancy with that builder
}

但是,我真正想要的是这样的函数签名:

template <std::constructible_from<std::string>... FooTypes>
void bar (SomeData data)

对于每种类型,addFoo 被调用,例如

addFoo<Bar, Baz> (data);

// expands internally to
auto builder = Builder (data).addFoo<Bar> (createUuid()).addFoo<Baz> (createUuid());

我通常知道折叠表达式的存在,但我无法弄清楚将其编写为折叠表达式的语法。我什至不确定折叠表达式是否支持链式成员函数调用。有人可以给我一个关于如何实现它的提示或者确认这确实是不可能的吗?

最佳答案

可以使用逗号运算符(,)来展开参数包

template <std::constructible_from<std::string>... FooTypes>
void bar (SomeData data)
{
  auto builder = Builder (data);
  ((builder = std::move(builder).addFoo<FooTypes>(createUuid())), ...);
}

关于c++ - 如何使用折叠表达式调用成员函数链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77460298/

相关文章:

c++ - 可视化应用程序表单设计器

c++ - 模块接口(interface)中的内联含义

c++ - 折叠表达式 : right shift initialization behavior

c++ - 我可以让 `std::ranges::views::elements` 在我的类型范围内工作吗

C++ 错误 : operator[] cannot be overloaded

c++ - 可变参数模板扩展 - 扩展除第 i 个条目之外的所有条目

C++20 概念 : requires expression and perfect forwarding

c++ - 你能用折叠表达式实现 fn(x1 ^ fn(x0)) 吗?

c++ - 非递归访问自定义变量-如何优雅地返回值?

c++ - 不明白为什么 const 限定符被丢弃