3
  void hello()
  {
    cout << "helloworld" << endl;
  }

  void hello(string s)
  {
    cout << "hello " << s << endl;
  }

  void doWork()
  {
    thread t1(static_cast<void ()>(&hello));
    thread t2(static_cast<void (string)>(&hello),"bala");
    t1.join();
    t2.join();
  }

错误:

thread.cc|19 col 42| error: invalid static_cast from type '<unresolved overloaded function type>' to type 'void()'                                                          
thread.cc|20 col 48| error: invalid static_cast from type '<unresolved overloaded function type>' to type 'void(std::string) {aka void(std::basic_string<char>)}'

我知道我可以使用typedef函数指针或 lambda。不可以用static_cast吗?

4

4 回答 4

11

您必须转换为函数指针类型(不是函数类型)

thread t1(static_cast<void (*)()>(&hello));
                           ^^^

函数类型(例如void())是一种通过参数和返回类型表示函数的类型。但是程序中不能有这些类型的变量(除了函数本身,这些是函数类型的左值)。但是,可以有对函数的引用或指向函数的指针,您希望使用后者。

当您尝试创建函数类型的变量(或临时对象)时(例如,您 typedef 一个函数类型,或将其用作模板参数),它的使用是可以的。std::function<void()>仅使用参数来指定其参数和返回类型,因此其设计者决定使用这种圆滑的语法。在内部,它不会尝试使用该类型创建变量。

于 2013-01-11T14:14:56.653 回答
1

该标准确定,在获取重载函数的地址时,可以使用该地址来消除歧义。这包括分配给适当类型的变量或强制转换。

您可能缺少的是 of 的类型&hello不是函数签名,而是函数指针,因此强制转换应该是 tovoid (*)()和/或void (*)(std::string)

void (*f)() = &hello;                  // target variable determines
                                       // the correct overload
thread thr( (void(*)())&hello );       // or a cast (C or static_cast<>)
thread thr( static_cast<void(*)()>(&hello) );
于 2013-01-11T14:18:55.070 回答
0

如果你使用 std 线程你可以写

std::thread(hello);
std::thread(hello, "blabla");
于 2013-01-11T14:18:00.050 回答
-1

为什么要投?您可以使用 std::bind 或直接发送指针

编辑:

正确,这是做不到的,肯定需要演员表。

于 2013-01-11T14:12:15.180 回答