gpt4 book ai didi

C++ - 使用 std::function 将成员函数传递给成员对象

转载 作者:行者123 更新时间:2023-11-28 05:49:56 31 4
gpt4 key购买 nike

我试图将成员函数对象传递给成员对象,但我在 VS 2013 中收到以下错误:

error C2664: 'void std::_Func_class<_Ret,>::_Set(std::_Func_base<_Ret,> *)' : cannot convert argument 1 from '_Myimpl *' to 'std::_Func_base<_Ret,> *'

代码如下:

#include <iostream>
#include <functional>

class Bar {
public:
Bar(){};
Bar(std::function<void(void)> funct_) : funct(funct_){}

void setFunct(std::function<void(void)> funct_){
funct = funct_;
}
void run(){
for (int k = 0; k < 10; k++)
funct();
};
std::function<void(void)> funct;

};

class Foo{
public:
Foo(){
bar.setFunct(&Foo::printSimpleFoo);
}

void printSimpleFoo(){
std::cout << "Hello World" << std::endl;
}

void start(){
bar.run();
}

private:
Bar bar;
};

int _tmain(int argc, _TCHAR* argv[])
{
Foo foo;
foo.start();

system("pause");
return 0;
}

所以我希望 Bar 能够从其父对象中获取具有特定签名的任意函数,即 void(void) 并在其 run()成员函数(会被父类的start()成员函数调用)

我研究过类似的问题。许多人建议使用 std::mem_fn 但我不清楚如何在此设置中使用它(函数必须传递给不同的对象)。

最佳答案

所需的函数签名是 void (*)(void)printSimpleFoo 的签名是 void (Foo::*)(void).

您可以使用std::bind 来捕获对象实例。对象实例是必需的,因为您不能使用关联的对象实例调用成员函数。 std::bind 本质上存储对象实例,以便函数具有适当的签名。

bar.setFunct(std::bind(&Foo::printSimpleFoo, this));

示例代码

#include <iostream>
#include <functional>

class Bar
{
public:
Bar() {}

Bar(std::function<void(void)> funct_) : funct(funct_) {}

void setFunct(std::function<void(void)> funct_)
{
funct = funct_;
}

void run()
{
for (int k = 0; k < 10; ++k)
{
funct();
}
};

std::function<void(void)> funct;
};

class Foo
{
public:
Foo()
{
bar.setFunct(std::bind(&Foo::printSimpleFoo, this));
}

void printSimpleFoo()
{
std::cout << "Hello World\n";
}

void start()
{
bar.run();
}

private:
Bar bar;
};

int main()
{
Foo foo;
foo.start();

return 0;
}

示例代码输出

Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World

Live Example

关于C++ - 使用 std::function 将成员函数传递给成员对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35462332/

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