gpt4 book ai didi

c++ - 如何在 Visual Studio 11 中将成员函数直接绑定(bind)到 std::function?

转载 作者:IT老高 更新时间:2023-10-28 22:15:38 25 4
gpt4 key购买 nike

我可以轻松地将成员函数绑定(bind)到 std::function,方法是使用带有捕获子句的 lambda 表达式包装它们。

class Class
{
Class()
{
Register([=](int n){ Function(n); });
}

void Register(std::function<void(int)> Callback)
{

}

void Function(int Number)
{

}
};

但我想直接绑定(bind)它们,如下所示。

// ...
Register(&Class::Function);
// ...

我觉得按照C++11的标准,这个应该是支持的。但是,在 Visual Studio 11 中,我得到了这些编译器错误。

error C2440: 'newline' : cannot convert from 'int' to 'Class *'

error C2647: '.*' : cannot dereference a 'void (__thiscall Class::* )(int)' on a 'int'

最佳答案

I think according to the C++11 standard, this should be supported

不是真的,因为非静态成员函数有一个隐式的第一个参数类型(cv-qualified)YourType*,所以在这种情况下它不匹配void(int) 。因此需要std::bind :

Register(std::bind(&Class::Function, PointerToSomeInstanceOfClass, _1));

例如

Class c;
using namespace std::placeholders; // for _1, _2 etc.
c.Register(std::bind(&Class::Function, &c, _1));

Edit 您提到要使用相同的 Class 实例调用它。在这种情况下,您可以使用简单的非成员函数:

void foo(int n)
{
theClassInstance.Function(n);
}

然后

Class c;
c.Register(foo);

关于c++ - 如何在 Visual Studio 11 中将成员函数直接绑定(bind)到 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17131768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com