gpt4 book ai didi

c++ - 如何对参数包进行分组或配对折叠?

转载 作者:行者123 更新时间:2023-12-03 01:01:23 27 4
gpt4 key购买 nike

template<class Msg, class... Args>
std::wstring descf(Msg, Args&&... args) {
std::wostringstream woss;

owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all

//or

owss << Msg << ". " << args[0] << ": '" << args[1] << "' " << args[2] << ": '" << args[3] << "' "; //... pseudo code, and so on...
}

我知道我可以使用成对列表或类似的东西来代替,但我感兴趣的是如何在保持函数语法的同时做到这一点:

const auto formatted = descf(L"message", "arg1", arg1, "arg2", arg2);

最佳答案

您可以使用折叠表达式!它不是最漂亮的*,但它比所有提出的非折叠解决方案都要短:

template<class T, class ... Args>
std::wstring descf(T msg, Args&&... args) {
std::wostringstream owss;
owss << msg << ". ";

std::array<const char*, 2> tokens{": '", "' "};
int alternate = 0;
((owss << args << tokens[alternate], alternate = 1 - alternate), ...);

return owss.str();
}

带有示例输出的演示:https://godbolt.org/z/Gs8d2x

我们对逗号运算符执行折叠,其中每个操作数都是一个 args 和交替标记的输出,再加上切换标记索引(后两者与另一个逗号运算符组合)。

*对于熟悉折叠表达式(和逗号运算符)的读者来说,这可能是“最好的”代码,但对于其他人来说,这完全是胡言乱语,所以请自行判断是否要对自己的代码施加这种影响。代码库。

关于c++ - 如何对参数包进行分组或配对折叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59175037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com