【问题标题】:How to specify the overload a callable should point to? [duplicate]如何指定可调用对象应指向的重载? [复制]
【发布时间】:2014-02-16 21:35:05
【问题描述】:
#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构造函数中应该使用哪个重载?
【问题讨论】:
标签:
c++
overload-resolution
【解决方案1】:
你可以投:
using callback_type = void (Callable::*)();
std::thread some_thread(
static_cast<callback_type>(&Callable::start), &some_object );
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
【解决方案2】:
您可以定义一个指向成员的指针并在函数调用中使用它
void ( Callable::*p )( unsigned ) = &Callable::start;
std::thread some_thread( p, &some_object );
【解决方案3】:
您可以通过强制转换在重载之间进行选择:
typedef void (Callable::*voidFunc)();
int main()
{
Callable some_object;
std::thread some_thread( (voidFunc)&Callable::start, &some_object );
【解决方案4】:
根据this answer 的第二部分,以下是更安全的选择:
void (Callable::*)() start_fun = &Callable::start;
std::thread some_thread( start_fun, &some_object );
这是因为您避免了静态转换,如果找不到匹配的成员函数,则会在第一行出现编译器错误。