関数テンプレートがあります:
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()のオーバーロードを作成する場合は、report_func()を呼び出す行を削除するだけで、f()の実装コードを複製する必要があります。
私にはこの種の関数がいくつかあります。ReportFuncを使用して呼び出す場合と、使用しない場合があります。したがって、すべてのコードの重複を避けたいと思います。空のラムダやvoidなどを渡す場合、C ++ 11コンパイラでreport_func()を呼び出さないf()のインスタンス化を生成する必要がありますか?そして、report_func()を呼び出す行を削除するのと同じくらい速いですか、それとも空のラムダでさえ、コンパイラーが最適化しないオーバーヘッドがありますか?(私の特定のケースでは、GCCを使用しています)
また、空のラムダが実際にそれを行い、関数f()の戻り型をReportFuncに変更した場合、つまりreport_func引数を返す場合でも、戻り値を変数に格納して呼び出すのは安全ですか?(空のラムダであっても、理論的には可能ですが、実際には何も起こらないことを意味します)