#include #include template class F, typename... Ts> void dispatch(int x, Ts&& ...args) { if (x > 0) F()(std::forward(args)...); else F()(std::forward(args)...); } template struct bla { void operator()(int&& a, char&& b, double&& c) const { std::cout << typeid(T).name() << " " << a << " " << b << " " << c << std::endl; } }; main() { std::cout << "main()" << std::endl; //bla()(1, 'a', 5.5); dispatch(5, 1, 'a', 5.5); dispatch(-5, 1, 'a', 5.5); }