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

时间:2015-08-05 16:59:55

标签: c++ functor c++17

如可能的实施'所示。 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)...);
}

2 个答案:

答案 0 :(得分:8)

指向成员的指针是Callable,而invoke(或INVOKE,因为标准中已知soon-to-be-seven-bullet-point construct)魔术处理此案例(嗯,四,很快就会有6个案例),而函数调用语法却没有。

答案 1 :(得分:2)

我想用语法示例来补充T.C.'s answer

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
    
      

    错误:必须使用'。'或' - &gt; '在[...]

    中调用指向成员的指针功能

    相反,你必须解决它:

    func_call([obj, fn](int a) { return (obj.*fn)(a); }, 24);
    
  • 如果你有调用方法,你可以写一下:

    func_invoke(fn, obj, 24);