何时使用std :: invoke而不是简单地调用invokable?

Ela*_*iss 13 c++ std c++17

据我了解,std::invoke允许我做类似的事情:

std::invoke(f, arg1, arg2, ...);
Run Code Online (Sandbox Code Playgroud)

是否存在比简单操作更有利的情况:

f(arg1, arg2, ...);
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 21

如果invocable是指向成员函数的指针,那么您需要执行以下操作之一:

(arg1->*f)(arg2,...);
(arg1.*f)(arg2,...);
Run Code Online (Sandbox Code Playgroud)

取决于是什么arg1.

INVOKE(和它的官方库对应物std::invoke)几乎旨在简化这些混乱.

您将使用std::invoke支持传递任何可调用代码的代码的调用者,而不必使用lambda或调用来调整其调用站点std::bind.

  • @EladWeiss看看`std :: invoke`的[示例实现](http://en.cppreference.com/w/cpp/utility/functional/invoke)然后感谢你不必写下你自己:P (4认同)
  • @EladWeiss - 是的.我们要么必须写一堆专业或者自己重新实现INVOKE(并且想象一下支持智能指针,yikes).新实用程序是一个库编写器工具. (3认同)
  • @ Rakete1111现在想象一下,如果"如果constexpr"不可用,那会怎么样? (2认同)

Dev*_*ull 5

std::invoke当您创建lambda并需要立即调用它时,它很有用。如果lambda大,后面很难加上括号:

[] (/* args */) {
    // many lines here
    // ...
} (/* args */)
Run Code Online (Sandbox Code Playgroud)

std::invoke(
    [] (/* args */) {
        // many lines here
        // ...
    },
    /* args */);
Run Code Online (Sandbox Code Playgroud)