Uniformly invoking anything callable
Developers, and especially those who implement libraries, sometimes need to invoke a callable object in a uniform manner. This can be a function, a pointer to a function, a pointer to a member function, or a function object. Examples of such cases include std::bind
, std::function
, std::mem_fn
, and std::thread::thread
. C++17 defines a standard function called std::invoke()
that can invoke any callable object with the provided arguments. This is not intended to replace direct calls to functions or function objects, but it is useful in template metaprogramming for implementing various library functions.
Getting ready
For this recipe, you should be familiar with how to define and use function pointers.
To exemplify how std::invoke()
can be used in different contexts, we will use the following function and class:
   int add(int const a, int const b)    {   return a + b;    }    struct foo    {    int x = 0;    void increment_by(int const...