如何将重载的非成员函数传递给线程?

时间:2016-05-08 09:56:24

标签: c++ multithreading

void foo(int n){cout << n << '\n';}

void foo(string s){cout << s << '\n';}

int main(){
    thread t1{foo,9};
    thread t2{foo,"nine"};
    t1.join();
    t2.join();
    return 0;
}

我收到错误

没有匹配函数来调用std :: thread :: thread大括号括起来的初始化列表

4 个答案:

答案 0 :(得分:2)

您需要使用强制转换才能选择所需的重载函数。

以下是执行此操作的代码:

void foo(int n){cout << n << '\n';}

void foo(string s){cout << s << '\n';}

int main(){
    void (*foo1)(int) = foo;
    void (*foo2)(string) = foo;
    thread t1(foo1,9);
    thread t2(foo2,"nine");
    t1.join();
    t2.join();
    return 0;
}

答案 1 :(得分:2)

为了简单和可读性,我使用lambda函数:

thread t1([]{foo(9); });
thread t2([]{foo("str");});

答案 2 :(得分:0)

或者你可以用C风格直接投射它:

public class Type {
    ...
    @ElementList(inline = true, entry = "inflection")
    private List<String> inflections = new ArrayList<String>();
    ...
}

答案 3 :(得分:0)

您可以使用static_cast消除歧义:

  

static_cast也可用于通过执行到特定类型的函数到指针的转换来消除函数重载的歧义,如std :: transform(s.begin(),s.end(),s.begin(),的static_cast(标准::在toupper));

thread t1{static_cast<void(*)(int)>(foo),9};
thread t2{static_cast<void(*)(string)>(foo),"nine"};