5

可能重复:
使用成员函数启动线程

我对 C++ 很陌生。我的经验主要是使用 javascript 和 java。

我在 Lion 上使用 Xcode。以下代码给了我一个编译错误“必须调用对非静态成员函数的引用;您的意思是不带参数调用它吗?”

class MyClass {
private:
    void handler() {
    }

public:
    void handleThings() {
        std::thread myThread(handler);
    }
};

我也尝试过this->handler,&handler和其他变体,但都没有奏效。这段代码虽然编译并完成了我想要的:

class MyClass {
private:
    void handler() {
    }

public:
    void handleThings() {
        std::thread myThread([this]() {
            handler();
        });
    }
};

为什么我不能传递对成员函数的引用?我的解决方法是最好的解决方案吗?

4

3 回答 3

15
std::thread myThread(&MyClass::handler, this);
myThread.join();
于 2013-01-22T11:25:36.093 回答
5

std::mem_fun如果您不想使用 lamda,可以使用 。

你能做到吗?

std::thread myThread(std::mem_fun(&MyClass::handler),this);

std::thread接受函数的参数(这是第一个参数)并 this作为参数传递给mem_fun对象,然后对象调用处理函数this

您也可以很简单地执行以下操作,礼貌 -使用成员函数启动线程

std::thread myThread(&MyClass::handler,this);
于 2013-01-22T07:15:52.277 回答
5

用于lambda访问成员函数内的类成员,您需要捕获this. [this]在以下代码中是强制性的:

void handleThings() 
{
    std::thread myThread([this]() {
        handler();
    });
}

您可以this通过引用捕获,但它不如按值捕获它有效。因为通过引用需要双重间接(模编译器优化)

void handleThings() {
        std::thread myThread([&]() {
            handler();
        });
    }

Lambdas通常是比 更好的选择bind

  • 更容易让读者理解。
  • 更高效。
于 2013-01-22T07:21:29.697 回答