【发布时间】:2016-02-23 11:40:10
【问题描述】:
阅读 C++17 关于删除标准中一些已弃用、旧和未使用部分的提案 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190.htm) 我发现第 D.9 节有点奇怪:
D.9 “活页夹” [depr.lib.binders]
这定义了 bind1st()/bind2nd(),它们被 bind() 严格取代。 (将来,我会争辩说 bind() 本身已被 lambdas 取代 尤其是通用的 lambda,所以 bind() 应该被弃用,但是 不在此提案中。)
我没有得到关于 bind() 本身被 lambdas 取代的评论。
如果我有课:
class A
{
public:
void f(int a){}
void f(int a, int b){}
}
我想将指向A::f 的函数指针传递给某个函数someFunction,以便该函数可以在从A 实例化的对象上调用它,我声明someFunction:
void someFunction(const std::function<void(int, int)>&);
并称它为:
A a;
someFunction(std::bind(static_cast<void (A::*)(int, int)> (&A::f),
std::ref(a),
std::placeholders::_1,
std::placeholders::_2));
如何使用 lambda 实现相同的目标? bind() 真的没有什么是 lambda 做不到的吗?
【问题讨论】:
-
C++14 具有通用 lambdas (
auto f = [](auto x) { ... })。我仍然喜欢bind,我认为它不应该被弃用。 -
本文Appendix: Why we need bind when we have a generic lambda? 中的部分使bind 的案例仍然有用,但它似乎不是一个强有力的案例。
-
@ShafikYaghmour 摘要中的例子对我来说是一个非常有力的案例:)
-
这绝对是一个视角问题 :-) 我想我的意思是没有任何参数可以证明绑定可以做到而 lambda 无法做到。我们当然可以在可用性上存在分歧。
标签: c++ lambda std-function stdbind