#include <iostream>
void printer(float i){
std::cout<<i<<std::endl;
}
//////////////////////////////////
//template
template<typename F,typename Arg>
void Invoker(F func, Arg arg){
func(arg);
}
/////////////////////////////////
/////////////////////////////////
// function pointer
typedef
void // return type
(*void_func_type) //this "type" name
(float) //function args
;//end
void Invoker1(void_func_type func, float arg){
func(arg);
}
////////////////////////////////
//functional
#include <functional>
void Invoker2(std::function<void(float)> func, float arg){
func(arg);
}
int main(void) {
// template
Invoker(printer,10.f);
// function pointer
Invoker1(printer,10.f);
//functional
Invoker2(printer,10.f);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBwcmludGVyKGZsb2F0IGkpewoJc3RkOjpjb3V0PDxpPDxzdGQ6OmVuZGw7Cn0KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovL3RlbXBsYXRlCnRlbXBsYXRlPHR5cGVuYW1lIEYsdHlwZW5hbWUgQXJnPgp2b2lkIEludm9rZXIoRiBmdW5jLCBBcmcgYXJnKXsKCWZ1bmMoYXJnKTsKfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBmdW5jdGlvbiBwb2ludGVyCnR5cGVkZWYgCgl2b2lkIC8vIHJldHVybiB0eXBlCgkoKnZvaWRfZnVuY190eXBlKSAvL3RoaXMgInR5cGUiIG5hbWUKCShmbG9hdCkgLy9mdW5jdGlvbiBhcmdzCgk7Ly9lbmQKdm9pZCBJbnZva2VyMSh2b2lkX2Z1bmNfdHlwZSBmdW5jLCBmbG9hdCBhcmcpewoJZnVuYyhhcmcpOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovL2Z1bmN0aW9uYWwKI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CnZvaWQgSW52b2tlcjIoc3RkOjpmdW5jdGlvbjx2b2lkKGZsb2F0KT4gZnVuYywgZmxvYXQgYXJnKXsKCWZ1bmMoYXJnKTsKfQoKCmludCBtYWluKHZvaWQpIHsKCS8vIHRlbXBsYXRlCglJbnZva2VyKHByaW50ZXIsMTAuZik7CgkvLyBmdW5jdGlvbiBwb2ludGVyCglJbnZva2VyMShwcmludGVyLDEwLmYpOwoJCgkvL2Z1bmN0aW9uYWwKCUludm9rZXIyKHByaW50ZXIsMTAuZik7CgoJcmV0dXJuIDA7Cn0K