【问题标题】:usage of this pointer in std::bind在 std::bind 中使用这个指针
【发布时间】:2017-11-28 13:09:46
【问题描述】:

当我偶然发现以下答案时,我试图阅读和理解 std::bind

Usage of std::bind

我看到一个如下声明:

auto callback = std::bind(&MyClass::afterCompleteCallback, this, std::placeholders::_1);

我无法理解“this”指针的用途以及何时应该使用它? 'this' 指针表示当前对象地址本身,所以它意味着'使用这个对象' - 如果是这样,我如何在类外使用相同的语句仍然具有相同的含义?

【问题讨论】:

  • 当您提供指向(可能是非静态的)成员函数 &MyClass::afterCompleteCallback 的指针时,没有对象就无法调用它。因此,还提供了对象指针:this。如果你想在类之外构造bind,只需插入指向相应对象的指针而不是this。例如。对于MyClass myClass;,它应该是&myClass
  • 之所以有效,是因为在 C++ 中,pointer->afterCompleteCallback(p1) 与 MyClass::afterCompleteCallback(pointer, p1); 相同。只是编译器不允许直接使用。

标签: c++ c++11


【解决方案1】:

在课堂内,在课堂外,这对于std::bind 的使用并不重要。非静态成员函数必须使用它所属的类的有效对象来调用。 std::bind 认为该对象是它在可调用后给出的第一个参数,简单明了。

因此,您可以在类中按照您的说明进行操作,并提供“当前”对象作为第一个绑定参数。

或者你可以在类之外做,如果成员是可访问的,并提供 some 对象(如@Scheff pointed out):

MyClass myClass; 
using namespace std::placeholders;
auto callback = std::bind(&MyClass::afterCompleteCallback, &myClass, _1);

您甚至可以选择根本不绑定对象,并为此保留一个占位符:

MyClass myClass; 
using namespace std::placeholders;
auto callback = std::bind(&MyClass::afterCompleteCallback, _1, _2);

callback(myClass, /*Other arg*/);

此外,尽管您标记了。随着 中 lambdas 的变化,真的没有理由再使用 std::bind 了。

【讨论】:

  • 你能解释一下最后一句是什么意思吗?
  • @Jaa-c - watch this lecture 会更有教育意义。如果您不熟悉演示者,那就是 Stephan T. Lavavej,Micrsoft 标准库实现的维护者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多