【发布时间】:2016-09-12 13:46:46
【问题描述】:
我很困惑为什么需要std::mem_fn。
我有一个函数,它接受任何可调用(lambda、函数指针等),并将其绑定到一个参数。
例如:
template<class T>
void Class::DoBinding(T callable) {
m_callable = std::bind(callable, _1, 4);
}
//somewhere else
Item item;
m_callable(item);
我见过的所有代码示例:
//some defined member function
Item::Foo(int n);
DoBinding(std::mem_fn(&Item::Foo));
为什么不能简单:
DoBinding(&Item::Foo);
似乎后者无需使用std::mem_fn即可调用,那么为什么需要它呢?
【问题讨论】:
-
不,你不需要
mem_fn。你确实需要它来做其他事情。 -
您永远不应该将未知类型的值传递给
std::bind。如果该类型本身是一个绑定表达式,那么该行为就会令人惊讶。换句话说,std::bind应该用在叶代码中,而不是在通用代码中。 -
使用 lambda 代替 std::bind 怎么样?我觉得语法更清晰,当你开始使用 C++14 时,它应该涵盖所有(几乎所有?)与 bind 相同的用例
-
@AndyG 除了“几乎所有”实际上并没有涵盖 OP 询问的情况。
-
@Barry:但它应该使用 C++14,不是吗?我意识到标签是 C++11,所以也许评论有点误导。