2014-02-16 3 views
3
#include <thread> 
struct Callable 
{ 
    void start() {}; 
    void start(unsigned) {}; 
}; 

int main() 
{ 
    Callable some_object; 
    std::thread some_thread(&Callable::start, &some_object); 

    some_thread.join(); 
} 

&Callable::start이 모호하기 때문에이 코드는 컴파일되지 않습니다. 어떤 과부하가 std::thread 생성자에서 사용되어야 하는지를 지정하는 방법이 있습니까?호출 가능 항목이 가리키는 오버로드를 지정하는 방법은?

당신은 캐스트에 의해 오버로드를 선택할 수 있습니다

답변

4

당신은 캐스트 할 수 있습니다 :

using callback_type = void (Callable::*)(); 

std::thread some_thread(
    static_cast<callback_type>(&Callable::start), &some_object); 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
1

는 :

typedef void (Callable::*voidFunc)(); 

int main() 
{ 
    Callable some_object; 
    std::thread some_thread((voidFunc)&Callable::start, &some_object); 
2

당신은 멤버에 대한 포인터를 정의하고 함수 호출에서 사용할 수 있습니다

void (Callable::*p)(unsigned) = &Callable::start; 
std::thread some_thread(p, &some_object); 
1

this answer의 두 번째 부분에 따르면 다음이 더 안전한 옵션이됩니다.

void (Callable::*)() start_fun = &Callable::start; 
std::thread some_thread(start_fun, &some_object); 

정적 캐스팅을 방지하고 일치하는 멤버 함수가 없으면 첫 번째 줄에 컴파일러 오류가 발생하기 때문입니다.