11

如“可能的实现”所示,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)...);
}

?

4

2 回答 2

8

指向成员的指针是Callable, 和invoke(或者INVOKE,正如标准中已知的即将成为七个要点的构造)的魔法处理这种情况(嗯,实际上是四个并且很快将是六个情况),而函数调用语法没有。

于 2015-08-05T17:06:30.667 回答
4

我想用一个句法示例来补充TC 的答案:

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
    

    错误:必须使用'. ' 或 '-> ' 在 [...] 中调用指向成员函数的指针

    相反,您必须解决它:

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

    func_invoke(fn, obj, 24);
    
于 2017-01-09T10:34:44.630 回答