C++调用函数有多种形式,普通函数和函数指针使用(),成员函数通过.或->进行调用。
如果在模板中调用不同类型的函数,这会是一个问题,因为调用的形式是不一致的。
C++17引入了invoke,用来从形式上统一函数调用:
#include <iostream>
#include <functional>
using namespace std;
auto f1 = [](int a, int b) { return a + b; };
int f2(int a, int b) { return a + b; }
class F{
public:
int f3(int a, int b) { return a + b; };
};
int main()
{
cout<<invoke(f1, 1, 2)<<endl;
cout<<invoke(f2, 1, 2)<<endl;
cout<<invoke(F::f3, F(), 1, 2)<<endl;
return 0;
}
运行程序输出
3
3
3
可以看到通过invoke,调用普通函数与成员函数在形式上是一致的了。
另外需要说明的是invoke还支持对类虚函数的多态调用:
#include <iostream>
#include <functional>
using namespace std;
class B{
public:
virtual int add(int a, int b) {
cout<<"in B"<<endl;
return a + b;
}
};
class D