成员函数可以在任何自由函数可以使用 std::function 的地方使用吗?

Can a member function be used anywhere a free function can using std::function?

本文关键字:函数 function 方使用 std 任何 可以使 自由 成员      更新时间:2023-10-16

我有一些代码(由GitHub上的progschj提供),我已经对其进行了调整以举例说明我的问题。MakeTask将任何函数及其参数移动到MakeTask中,从而产生packaged_task。创建的任务被执行,然后它的未来将返回给调用方。这非常流畅,但我也希望能够通过成员函数做到这一点。但是,如果我将 Func 放入结构中,MakeTask 中的 F&& 会失败,并出现代码中指出的错误。

#include <future>
#include <memory>
#include <string>
#include <functional>
template<class F, class... Args>
auto MakeTask( F&& f, Args&&... args )-> std::future< typename std::result_of< F( Args... ) >::type >
{
  typedef typename std::result_of< F( Args... ) >::type return_type;
  auto task = std::make_shared< std::packaged_task< return_type() > >(
    std::bind( std::forward< F >( f ), std::forward< Args >( args )... )
    );
  std::future< return_type > resultFuture = task->get_future();
  ( *task )( );
  return resultFuture;
}
struct A
{
  int Func( int nn, std::string str )
  {
    return str.length();
  }
};
int main()
{
  // error C2893: Failed to specialize function template 'std::future<std::result_of<_Fty(_Args...)>::type> MakeTask(F &&,Args &&...)'
  // note: 'F=int (__thiscall A::* )(int,std::string)'
  // note: 'Args={int, const char (&)[4]}'
  auto resultFuture = MakeTask( &A::Func, 33, "bbb" );  // does not compile
  int nn = resultFuture.get();
  return 0;
}

如果我将 Func 变成静态,我可以让它工作,但这会破坏我的应用程序代码的其他部分。

编辑1:我想出了std::function的语法,并使用新的错误消息修改了示例。MakeTask的F&&&move参数不接受我的aFunc作为可调用对象。

Edit2:由于Barry的回答,我将示例代码改回原始帖子,以便他的答案对未来的观众有意义。

&A::Func是一个

非静态成员函数,这意味着它需要一个A实例才能运行。所有函数对象/适配器使用的约定是,提供的第一个参数将是该实例。

MakeTask()要求第一个参数(F)可以与所有其他参数(Args...)一起调用。 &A::Func需要三个参数:类型为 A 的对象(或指向 Areference_wrapper<A> 的指针)、intstring 。你只是错过了第一个:

auto resultFuture = MakeTask( &A::Func, A{}, 33, "bbb" );
                                       ^^^^^