#include <iostream>
#include <functional>
void sayHello()
{
std::cout << "aaaa" << std::endl;
}
int sayHi()
{
std::cout << "bbbb" << std::endl;
return 11;
}
template<typename R = void, typename... Args>
class Fn {
public:
Fn(std::function<R(Args...)> fun) : _fun(fun)
{
}
R operator()(Args... args)
{
return _fun(args...);
}
private:
std::function<R(Args...) > _fun;
};
template <typename T>
class Func {
public:
Func(T fun) {
if (!fun) {
throw "fun nullptr";
}
_fun = fun;
}
template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5>
R Call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
return _fun(a1, a2, a3, a4, a5);
}
template<typename R, typename A1, typename A2, typename A3, typename A4>
R Call(A1 a1, A2 a2, A3 a3, A4 a4) {
return _fun(a1, a2, a3, a4);
}
template<typename R, typename A1, typename A2, typename A3>
R Call(A1 a1, A2 a2, A3 a3) {
return _fun(a1, a2, a3);
}
template<typename R, typename A1, typename A2>
R Call(A1 a1, A2 a2) {
return _fun(a1, a2);
}
template<typename R, typename A1>
R Call(A1 a1) {
return _fun(a1);
}
template<typename R>
R Call() {
return _fun();
}
void Call() {
_fun();
}
private:
T _fun;
};
int sum(int i, int j, int k) {
return i + j + k;
}
int main()
{
Func<int (*)(int, int, int) > sumFunc(sum);
std::cout << "sumFunc.Call<int>(1, 2, 3) : " << sumFunc.Call<int>(1, 2, 3) << std::endl;
Fn<> sayHelloFn(sayHi);
sayHelloFn();
return 0;
}
Func对象例用call的重载实现,Fn使用变参和仿函数实现。
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2021/05/20 14:42