std :: bind与std :: function具有返回值

时间:2019-01-25 14:47:29

标签: c++ c++11

在通过std::function将成员函数转换为std::bind时遇到一些困难。我使用的是g ++ 7.3.0和-std=c++11,编译器报告:

../untitled2/main.cpp:25:42: error: no match for call to ‘(a) (std::_Bindres_helper<short int, short int (b::*)(), b>::type, int16_t*)’
   a0(std::bind<int16_t>(&b::run, b()), &r);
                                          ^
../untitled2/main.cpp:7:8: note: candidate: template<class t_result> void a::operator()(std::function<t_result()>&&, t_result*)
   void operator()(std::function<t_result()>&& p_function, t_result* p_result)
        ^~~~~~~~
../untitled2/main.cpp:7:8: note:   template argument deduction/substitution failed:
../untitled2/main.cpp:25:42: note:   ‘std::_Bindres_helper<short int, short int (b::*)(), b>::type {aka std::_Bind_result<short int, short int (b::*(b))()>}’ is not derived from ‘std::function<t_result()>’
   a0(std::bind<int16_t>(&b::run, b()), &r);

当它尝试编译此代码时:

     1  #include <chrono>
     2  
     3  
     4  struct a
     5  {
     6    template<typename t_result>
     7    void operator()(std::function<t_result()>&& p_function, t_result* p_result)
     8    {
     9      *p_result = p_function();
    10    }
    11  };
    12  
    13  struct b
    14  {
    15    int16_t run() { return -5; }
    16  };
    17  
    18  int
    19  main()
    20  {
    21    a a0;
    22  
    23    int16_t r;
    24  
    25    a0(std::bind<int16_t>(&b::run, b()), &r);
    26  
    27    return 1;
    28  }

但是,编译器会编译以下代码:

     1  #include <chrono>
     2  
     3  
     4  struct a
     5  {
     6    template<typename t_result>
     7    void operator()(std::function<t_result()>&& p_function, t_result* p_result)
     8    {
     9      *p_result = p_function();
    10    }
    11  };
    12  
    13  struct b
    14  {
    15    int16_t run() { return -5; }
    16  };
    17  
    18  int
    19  main()
    20  {
    21    a a0;
    22  
    23    int16_t r;
    24  
    25    std::function<int16_t()> f = std::bind<int16_t>(&b::run, b());
    26  
    27    a0(std::move(f), &r);
    28  
    29    return 1;
    30  }

所以,为什么第二个代码可以编译,但如果AFAIK无法通过,则我无法将两种情况下的同一个对象传递给a::operator()

非常感谢您的时间!

0 个答案:

没有答案