何时需要 c++17 std::apply/invoke 进行编程?

Tro*_*yvs 2 c++ invoke apply c++17

只要 c++ 是面向对象的编程语言,我不确定是否std::applystd::invoke必要的实用程序,它会转换:

Object.Function(Args...)
Run Code Online (Sandbox Code Playgroud)

进入:

std::invoke(Object, Function, Args)
Run Code Online (Sandbox Code Playgroud)

看起来像 C 风格的函数调用。所以我的问题是,这种场景什么时候对于日常编程来说是必要的/方便的?或者,是否存在使用apply/invoke使事情变得更简单的情况?

您能帮忙举一个很好的例子吗?多谢!

康桓瑋*_*康桓瑋 5

std::invoke使所有Callable对象能够被统一调用,其中包含无法用常规函数调用形式调用的成员函数指针和成员变量指针f(args...)

struct S {
  void f(int i);
  int x;
};

int main() {
  auto mem_vptr = &S::x;
  auto mem_fptr = &S::f;
  S s;
  std::invoke(mem_vptr, s);    // invoke like s.*mem_vptr;
  std::invoke(mem_fptr, s, 0); // invoke like (s.*mem_fptr)(0);
}
Run Code Online (Sandbox Code Playgroud)

  • 一个重要的注意事项是,您经常会在模板中执行此操作,其中将 Callable 作为(推导的)参数 (3认同)