初识std::invoke
std::invoke是c++17标准库引入的一个函数模板。这个函数模板能做什么?原理是什么?先来看一个简单的例子,回答std::invoke“能做什么”。
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
struct calc {
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
};
int main(int argc, char **argv)
{
int _add = std::invoke(add, 4, 5);
int _sub = std::invoke(sub, 7, 3);
calc cobj;
_add = std::invoke(&calc::add, cobj, 40, 5);
_sub = std::invoke(&calc::sub, cobj, 70, 3);
return 0;
}
通过上面的例子,可以看出,std::invoke仅仅是对函数指针的调用做了一下封装,这种技术被称作委托。单从上面的例子来看,std::invoke的存在没有任何意义:直接调用函数更加方便,效率也更高,而通过std::invoke调用并不能带来任何收益。再来看一个例子:
#include <functional>
#include <iostream>
#include <algorithm>
template <typename T>
class rectangle {
public:
rectangle(void) {}
T area_for_rectangle(T a, T b) { return a * b; }
};
template <typename T>
class circular {
public:
circular(void) {}
T area_for_circular(T r) { return 3.1