我有一个函数模板:
template <class ReportFunc>
void func (ReportFunc report_func)
{
for (/* ... */)
{
do_something (a, b);
report_func (a, b, c);
do_something_else (b, c);
}
}
有时需要在没有任何 ReportFunc 的情况下调用 func(),即循环只调用 do_something() 和 do_something_else() 而没有别的。如果我编写了一个不带 ReportFunc 参数的 f() 重载,我将不得不复制 f() 的实现代码,只需删除调用 report_func() 的行。
我有几个这样的函数——有时我想用 ReportFunc 调用它们,有时没有它。所以我想避免所有的代码重复。如果我传递一个空的 lambda 或 void 或类似的东西,它是否应该让 C++11 编译器生成一个不调用任何 report_func() 的 f() 实例?它是否与简单地删除调用 report_func() 的行一样快,甚至一个空的 lambda 也会有一些编译器未优化的开销?(在我的具体情况下,我使用 GCC)
另外:如果一个空的 lambda 确实这样做了,并且我将函数 f() 的返回类型更改为 ReportFunc,即它返回 report_func 参数,那么将返回的值存储在变量中并调用它是否仍然安全?(即使它是一个空的 lambda?所以理论上可以调用它,它只是意味着什么都没有发生)