C++17 中的折叠表达式
Fold Expression in C++17
我正在阅读 "C++17 - The Complete Guide" 一本书,我在第 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";
}
作者有什么理由不能这样做吗(没有将第一个参数与其余参数分开并且除了额外打印的space!):
template<typename... Types>
void print(Types const&... args)
{
([](const auto& x){ std::cout << x << " "; }(args), ...);
std::cout << "\n";
}
不,这只是审美问题。没有更多的理由。
如您所知,作者不可能按照您的建议去做,因为那样会留下额外的 space…
虽然作者 可以 做的是
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
显然可读的写法是
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 计划的功能。
因为我们和朋友一起玩得很开心
template<typename First, typename... Args>`
void print(First&& first, Args&&... args)
{
auto emit = [](auto&&...x) { ((std::cout << x), ...); };
(emit(first), ..., emit(' ', args)), emit('\n');
}
:)
我正在阅读 "C++17 - The Complete Guide" 一本书,我在第 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";
}
作者有什么理由不能这样做吗(没有将第一个参数与其余参数分开并且除了额外打印的space!):
template<typename... Types>
void print(Types const&... args)
{
([](const auto& x){ std::cout << x << " "; }(args), ...);
std::cout << "\n";
}
不,这只是审美问题。没有更多的理由。
如您所知,作者不可能按照您的建议去做,因为那样会留下额外的 space…
虽然作者 可以 做的是
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
显然可读的写法是
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 计划的功能。
因为我们和朋友一起玩得很开心
template<typename First, typename... Args>`
void print(First&& first, Args&&... args)
{
auto emit = [](auto&&...x) { ((std::cout << x), ...); };
(emit(first), ..., emit(' ', args)), emit('\n');
}
:)