void test(int var)
{
cout << var <<endl;
}
void calltest(function<void (int)> fun)
{
fun(120)
};
eg:
calltest(test);
calltest([](int var)->void{
cout<< "lambda ===" << var << endl;
})
/*=============================================*/
template<typename T, typename ..Args>
class CFObjHandler
{
public:
virtual T invoke(Args...args)const{};
}
template<Typename U, typename T, typename ...Args>
class CFObjHandlerChild : public CFObjHandler<T, Args...>
{
public:
CFObjHandlerChild(U&& var):functor(std::forward<U>(var))
{
}
virtual T invoke(Args...args)const
{
return functor(std::forward<Args>(args)...)
};
private:
U functor;
}
template<typename T>
class CallFuncObj;
template<typename T, typename... Args>
class CallFuncObj<T(Args...)>
{
template<typename U>
CallFuncObj(U&& acobj)
{
hander = new CFObjHandlerChild<U, T, Args...>(std::forward<U>(acobj));
}
~CallFuncObj()
{
delete handler;
}
public:
T operator()(Args... args) const
{
return hander->invoke(std::forward<Args>(args)...);
}
private:
CFObjHandler<T, Args...>*hander;
};
void callObjFun(CallFuncObj<void(int)> cobj)
{
cobj(120);
}