#include template void hello(T val) { std::cout << "Hello: " << val << "\n"; } template void bye(T val) { std::cout << "Bye: " << val << "\n"; } template struct HelloSayer { void operator()(T val) { hello(val); } }; template struct ByeSayer { void operator()(T val) { bye(val); } }; template class Function> void sayHelloOrBye(int val) { Function()(val); } int main() { sayHelloOrBye(4); sayHelloOrBye(5); }