我正在阅读《 C ++ 17-完整指南》一书,在107和108页上遇到了有关C ++ 17中折叠表达的示例:
template<typename First, typename... Args>
void print(First first, const Args&... args)
{
std::cout << first;
auto outWithSpace = [](const auto& arg)
{
std::cout << " " << arg;
};
(..., outWithSpace(args));
std::cout << "\n";
}
是否有任何原因导致作者无法按以下方式进行操作(没有将第一个参数与其余参数分开,并且没有多余的打印空间!):
template<typename... Types>
void print(Types const&... args)
{
([](const auto& x){ std::cout << x << " "; }(args), ...);
std::cout << "\n";
}
答案 0 :(得分:3)
您已经知道,作者可能并没有按照您的建议进行操作,因为那样会留下额外的空间……
作者可能所做的事情就像
template<typename First, typename... Args>
void print(First first, const Args&... args)
{
((std::cout << first), ..., (std::cout << ' ' << args)) << '\n';
}
或者,宁可
template <typename Arg, typename... Args>
std::ostream& print(Arg&& arg, Args&&... args)
{
return ((std::cout << std::forward<Arg>(arg)), ..., (std::cout << ' ' << std::forward<Args>(args))) << '\n';
}
实时示例here
答案 1 :(得分:0)
不,这只是美学问题。没有更多的理由。
答案 2 :(得分:0)
简单地说,可读的编写方式是
template<typename... Types>
void print(Types const&... args)
{
std::size_t n = 0;
(std::cout << " " + !n++ << args), ...);
std::cout << '\n';
}
(带有std::forward
的味道)。进行此类废话的诱惑(如果C ++ 17没有杀死精彩功能,则可以使用bool first
)是计划为template for
功能准备的动机。 C ++ 23。
答案 3 :(得分:0)
由于我们与朋友度过了愉快的时光
template<typename First, typename... Args>`
void print(First&& first, Args&&... args)
{
auto emit = [](auto&&...x) { ((std::cout << x), ...); };
(emit(first), ..., emit(' ', args)), emit('\n');
}
:)