cfa*_*771 4 c++ lambda templates callback c++11
我有一个功能模板:
template <class ReportFunc>
void func (ReportFunc report_func)
{
for (/* ... */)
{
do_something (a, b);
report_func (a, b, c);
do_something_else (b, c);
}
}
Run Code Online (Sandbox Code Playgroud)
有时需要在没有任何ReportFunc的情况下调用func(),即循环只调用do_something()和do_something_else()而不是其他内容.如果我写了一个没有采用ReportFunc参数的f()重载,我将不得不复制f()的实现代码,只需删除调用report_func()的行.
我有几种这样的功能 - 有时我想用ReportFunc调用它们,有时候没有它.所以我想避免所有的代码重复.如果我传递一个空的lambda或void或类似的东西,它是否应该使C++ 11编译器生成f()的实例化,而不调用任何report_func()?它是否像删除调用report_func()的行一样快,甚至一个空的lambda都有一些开销,编译器没有优化?(在我的具体情况下,我使用GCC)
另外:如果一个空的lambda确实这样做,并且我将函数f()的返回类型更改为ReportFunc,即它返回report_func参数,是否仍然可以将返回值存储在变量中并调用它?(即使它是一个空的lambda?所以在理论上称它是可能的,它只是意味着什么都没有发生)
只需传递一个空的仿函数.
只要你打开了优化,编译器就会实例化模板,内联对仿函数的(空)调用,所以什么都不做.它应该优化为零,不要打扰元编程试图删除调用.
我不会发誓G ++以同样的方式优化了"无所事事"lambda,但它应该这样做,因为类型是已知的并且它的函数调用运算符是内联的并且已知为空.
使用lambda没有固有的开销,它只是用于声明具有a的对象类型operator()并创建该类型的临时的语法糖.编译器前端需要做很多工作才能完成所有这些工作,但是一旦存在类型,优化器应该将它与用户定义的结构完全相同,后者执行相同的操作.因此,返回它也是安全的,它只是一个对象类型的实例,就像用户定义的函数对象一样.
| 归档时间: |
|
| 查看次数: |
2035 次 |
| 最近记录: |