boost::function
と標準バージョンstd::function
はどちらも、ライブラリによって提供されるラッパーです。それらは潜在的に高価でかなり重いので、実際に異種の呼び出し可能なエンティティのコレクションが必要な場合にのみ使用する必要があります。一度に1つの呼び出し可能なエンティティのみが必要である限り、auto
またはテンプレートを使用する方がはるかに優れています。
次に例を示します。
std::vector<std::function<int(int, int)>> v;
v.push_back(some_free_function); // free function
v.push_back(&Foo::mem_fun, &x, _1, _2); // member function bound to an object
v.push_back([&](int a, int b) -> int { return a + m[b]; }); // closure
int res = 0;
for (auto & f : v) { res += f(1, 2); }
反例は次のとおりです。
template <typename F>
int apply(F && f)
{
return std::forward<F>(f)(1, 2);
}
apply
この場合、次のように宣言することは完全に無償でした。
int apply(std::function<int(int,int)>) // wasteful
変換は不要であり、テンプレート化されたバージョンは、実際の(多くの場合不明な)タイプ、たとえばバインド式やラムダ式と一致する可能性があります。