【问题标题】:How to call an overloaded function with boost::thread?如何使用 boost::thread 调用重载函数?
【发布时间】:2015-06-23 05:56:54
【问题描述】:
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(&Foo::method,foo_obj_ptr,a,b) 创建线程会引发错误“没有重载函数需要四论”。 [我仅将 a 和 b 声明为字符。] 我的假设是,使用重载函数 boost::thread 无法正确绑定。对此有任何解决方案吗?

我在 vs2010 中使用 boost 1.54。

【问题讨论】:

标签: c++ boost overloading


【解决方案1】:

这与 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');

这个转换告诉编译器你指的是哪个函数。

【讨论】:

  • C++ 确实需要学习传递模板和重载函数。手动函数重载解决方案非常容易出错且没有必要。
  • @Puppy 不,你不能。当传递一个重载函数并且它“工作”时,你只是传递了一个由重载决议选择的特定函数。您不能在“重载函数类型”中传递多个函数并稍后进行重载解析。在我看来你应该是。与模板相同。该问题有一个示例,您不能将重载的成员函数传递给boost::thread,它必须是特定的。
【解决方案2】:

只需使用一个带有两个chars 的 lambda 函数

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

Live Example.

【讨论】:

  • 您可以简单地直接在 lambda 中传递参数,而不是将它们传递给线程以将它们传递给 lambda。
  • @Puppy 怎么样?问题在于将 2,3 传递给 method 将选择 int, float 重载,因为它在重载解析期间更匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多