两者boost::function
和标准版本std::function
都是库提供的包装器。它们可能很昂贵而且很重,只有在您确实需要一组异构的、可调用的实体时才应该使用它们。只要您一次只需要一个可调用实体,您最好使用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
转换是不必要的,模板版本可以匹配实际(通常是不可知的)类型,例如绑定表达式或 lambda 表达式。