我有一个像这样的构建器类
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/