gpt4 book ai didi

C++:将函数分配给 tr1::function 对象

转载 作者:搜寻专家 更新时间:2023-10-31 00:19:32 25 4
gpt4 key购买 nike

我们的一个类提供了 tr1::function 回调对象。但是,当我尝试为其分配成员函数时,出现编译器错误。

以下示例未经测试,仅供说明:

Foo.h:

class Foo()
{
public:
Foo();
std::tr1::function<void (int x)> F;
}

酒吧.h:

class Bar()
{
public:
Bar();
Foo* foo;
void HookUpToFoo();
void Respond(int x);
}

酒吧.cpp:

Bar()
{
this->foo = new Foo();
this->HookUpToFoo();
}

void Bar::HookUpToFoo()
{
this->foo->F = &Bar::Respond; // error
}

void Bar::Respond(int x)
{
// do stuff
}

我们得到的编译器错误是指 xrefwrap 中的一行并且是错误 1 ​​error C2296: '.*' : 非法,左操作数的类型为 'int' C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xrefwrap 64

..我在分配委托(delegate)时做错了什么?我想走更现代的路线,使用 tr1::function 而不是函数指针。

最佳答案

成员函数接受一个额外的隐藏参数:this。这使得它与只接受一个参数的 function 对象不兼容。您可以使用 bind 将成员函数绑定(bind)到特定实例,这在 tr1 中也可用:

using namespace std::tr1::placeholders;

this->foo->F = std::tr1::bind(&Bar::Respond, this, _1);

这确保 Bar::Respond 将使用绑定(bind)到 this 的正确值来调用。 _1 是附加参数 (x) 的占位符。

关于C++:将函数分配给 tr1::function 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999304/

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