#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;
}
