【问题标题】: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();
}

此代码无法编译,因为&amp;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 );
          

          这是因为您避免了静态转换,如果找不到匹配的成员函数,则会在第一行出现编译器错误。

          【讨论】:

            猜你喜欢
            • 2013-07-05
            • 2013-08-23
            • 1970-01-01
            • 1970-01-01
            • 2019-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多