为什么要使用invoke helper而不是调用functor呢?
why use invoke helper rather than just call functor?
从std::apply
的"可能实现"中可以看出,标准库函数std::invoke
被用来调用可调用对象F
。
在这种情况下需要吗?如果有,原因是什么?
写作的好处:
template<typename F, typename ... Args>
decltype(auto) func(F &&f, Args &&... args){
return std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
}
在:template<typename F, typename ... Args>
decltype(auto) func(F &&f, Args &&... args){
return std::forward<F>(f)(std::forward<Args>(args)...);
}
?
指向成员的指针是Callable
, invoke
(或INVOKE
,因为标准中很快会有七个项目点结构)的魔法处理了这种情况(好吧,实际上是四个,很快就会变成六个),而函数调用语法则不会。
我想补充T.C.用一个语法例子回答:
struct X {
int x;
int foo(int a) const { return a + x; }
};
,你有一个X
对象和指向成员函数的指针,例如:
X obj = X{1000};
auto fn = &X::foo;
,需要调用func
。
使用调用语法,这将不起作用:
func_call(fn, obj, 24); // compiler error
错误:必须使用'。"或"-> 的调用pointer-to-member函数[…]
相反,你必须绕过它:
func_call([obj, fn](int a) { return (obj.*fn)(a); }, 24);
如果您有invoke方法,您可以这样写:
func_invoke(fn, obj, 24);
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- Functor的实例变量在连续调用generate_n之间不保留
- 为什么要使用invoke helper而不是调用functor呢?