【发布时间】:2019-04-16 09:46:09
【问题描述】:
在c++17 中,我们有折叠表达式,它可以极大地简化可以使用编译器递归和 SFINAE 或重载来实现的代码。
比如下面的代码中
#include <iostream>
#include <utility>
template<typename ...Args>
void printer(Args&&... args) {
(std::cout << ... << args) << '\n';
}
void printer_cpp11() { }
template <typename First, typename ...Args>
void printer_cpp11(First&& first, Args&&... args)
{
std::cout << first;
printer_cpp11(std::forward<Args>(args)...);
}
int main()
{
printer(3, 4, "hello");
std::cout << std::endl;
printer_cpp11(3, 4, "hello");
return 0;
}
c++17 函数 printer(取自 cpp reference)与它的 c++11 版本 printer_cpp11 的工作完全相同。
在编译时,会生成函数 printer_cpp11 的多个重载,而使用折叠表达式需要单个函数 printer。
使用折叠表达式在性能方面是否比c++11 样式有优势?或者可以假设编译器内联printer_cpp11 的所有重载,从而创建具有同等性能的代码?
【问题讨论】:
-
printer(std::forward<Args>(args)...);我想你的意思是printer_cpp11(std::forward<Args>(args)...);,对吧? -
我认为
printer_cpp11应该自称,而不是printer -
假设不能做,但你为什么不分析它。
-
@L.F.当然,修正错字
-
printer_cpp11将导致编译器递归地实例化sizeof…(Args)不同的模板函数——这是模板膨胀和编译时间缓慢的常见情况
标签: c++ c++11 c++17 sfinae fold-expression