为什么要使用invoke helper而不是调用functor呢?

why use invoke helper rather than just call functor?

本文关键字:调用 functor invoke helper 为什么      更新时间:2023-10-16

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);