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関数ポインターまたはラムダを使用できることはわかっています。使用できませんstatic_castか?

4

4 に答える 4

11

関数ポインタ型(関数型ではない)にキャストする必要があります

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

関数型(例void())は、パラメーターと戻り型によって関数を表す型です。ただし、プログラムにこれらの型の変数を含めることはできません(関数自体を除いて、これらは関数型の左辺値です)。ただし、関数への参照または関数へのポインターが存在する可能性があり、後者を使用する必要があります。

関数型の変数(または一時オブジェクト)を作成しようとしない場合(たとえば、関数型をtypedefするか、テンプレートパラメーターとして使用する場合)、その使用は問題ありません。std::function<void()>パラメータを使用してパラメータとリターンタイプを指定するだけなので、設計者はこの洗練された構文を使用することにしました。内部的には、そのタイプの変数を作成しようとはしません。

于 2013-01-11T14:14:56.653 に答える
1

この標準では、オーバーロードされた関数のアドレスを取得するときに、そのアドレスを使用して曖昧さを解消できると判断しています。これには、適切なタイプの変数またはキャストへの割り当ての両方が含まれます。

おそらく欠落しているのは、のタイプが&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 に答える