私は引数としてファンクタをとり、何らかの処理の後でそれを実行するテンプレートコードを書いています。他の誰かがラムダ、関数ポインタ、さらにはstd::function
という関数を渡すかもしれませんが、それは主にラムダを意味します(他のフォーマットを禁止しているわけではありません)。私はそのラムダをどうすればいいのですか?参考として?または、他の何か。引数としてラムダを渡す - 参照または値による?
コード例 - 上記のコードで
#include <iostream>
#include <functional>
using namespace std;
template<typename Functor>
void f(Functor functor)
{
functor();
}
void g()
{
cout << "Calling from Function\n";
}
int main()
{
int n = 5;
f([](){cout << "Calling from Temp Lambda\n";});
f([&](){cout << "Calling from Capturing Temp Lambda\n"; ++n;});
auto l = [](){cout << "Calling from stored Lambda\n";};
f(l);
std::function<void()> funcSTD = []() { cout << "Calling from std::Function\n"; };
f(funcSTD);
f(g);
}
、私はそれこれらのいずれかを作るの選択をしました -
template<typename Functor>
void f(Functor functor)
template<typename Functor>
void f(Functor &functor)
template<typename Functor>
void f(Functor &&functor)
良い方法と理由は何だろうか?これらに何か制限がありますか?
IMHO、値渡し。 – NathanOliver
私はいつもfunctorテンプレートオブジェクトが値渡しされているのを見てきましたが、私はその理由を知らない。良い質問。 – YSC
related/dupe:http://stackoverflow.com/questions/8196345/passing-functor-object-by-value-vs-by-reference-c – NathanOliver