如何使用boost :: thread调用重载函数?

时间:2015-06-23 05:56:54

标签: c++ boost overloading

class Foo
{
public:
    void method(int a,float b)
    {
        cout<<"This method takes float and int";
    }
    void method(char a,char b)
    {
        cout<<"This method takes two characters";
    }
 };

在具有上述功能的重载类中,使用 boost :: thread newThread(&amp; Foo :: method,foo_obj_ptr,a,b)创建一个线程会引发错误&#34 ;没有重载函数需要四个参数&#34; 。 [我已经声明了a和b只作为字符。]我的假设是,使用重载函数boost :: thread无法正确绑定。有什么解决方案吗?

我在vs2010上使用了boost 1.54。

2 个答案:

答案 0 :(得分:4)

它与boost无关,而是让编译器了解调用重载函数时所指的函数(在新线程中或其他情况下)。

以下是您的代码+使用std::thread的解决方案(无主要区别):

#include <thread>
#include <iostream>

using namespace std;

class Foo
{
public:
    void method(int a,float b)
    {
        cout<<"This method takes float and int";
    }
    void method(char a,char b)
    {
        cout<<"This method takes two characters";
    }
 };


int main()
{
    Foo foo;
    typedef void (Foo::*fn)(char, char);
    thread bar((fn)(&Foo::method), &foo, 2, 3);
}

注意

typedef void (Foo::*fn)(char, char);

允许您将第一个参数转换为thread

thread bar((fn)(&Foo::method), &foo, 'b', 'c');

这个演员告诉编译器你指的是哪个函数。

答案 1 :(得分:2)

使用lambda函数,只需要两个char s

int main()
{
    Foo foo;
    thread yay([&foo](char a, char b){ foo.method(a, b); }, 2, 3);
    yay.join();
}

Live Example