成员函数可以在任何自由函数可以使用 std::function 的地方使用吗?
Can a member function be used anywhere a free function can using std::function?
我有一些代码(由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
的对象(或指向 A
或 reference_wrapper<A>
的指针)、int
和 string
。你只是错过了第一个:
auto resultFuture = MakeTask( &A::Func, A{}, 33, "bbb" );
^^^^^
相关文章:
- "error: no matching function for call to"构造函数错误
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- 如何为 v8::P ersistent<v8::Function> 创建到 c++ 函数的包装器
- C++复制函数重载导致"must be a nonstatic member function"错误
- C++派生类重载函数(带有 std::function 参数)不可见
- 如何将函数指针从 std::function 传递到 Linux 克隆?
- 如何在跳过所有内部实现的同时跳转到 GDB 中 std::function 中的函数?
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- C++:从重载函数转换为 std::function
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 插件:TypeError:addons.function() 不是一个函数
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 将另一个类的成员函数传递到 std::function 参数中
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 创建函数变体向量时"No matching function for call"错误
- 在windows上使用ctypes在python中包装c++函数:function未找到
- 我所有的函数都有错误 C2084:函数'function'已经有一个主体