| @@ -1,33 +1,25 @@ | |||||
| #include <utility> | #include <utility> | ||||
| #include <iostream> | #include <iostream> | ||||
| template<typename fun, typename... Ts> | |||||
| class Dispatcher { | |||||
| public: | |||||
| void dispatch(int x, Ts&& ...args) { | |||||
| if (x > 0) | |||||
| call<int>(std::forward<Ts>(args)...); | |||||
| else | |||||
| call<double>(std::forward<Ts>(args)...); | |||||
| } | |||||
| template<template<typename T> class F, typename... Ts> | |||||
| void dispatch(int x, Ts&& ...args) { | |||||
| if (x > 0) | |||||
| F<int>()(std::forward<Ts>(args)...); | |||||
| else | |||||
| F<double>()(std::forward<Ts>(args)...); | |||||
| } | |||||
| protected: | |||||
| template<typename T> | |||||
| void call(Ts&& ...args) { | |||||
| throw std::runtime_error("Not implemented"); | |||||
| template<typename T> | |||||
| struct bla { | |||||
| void operator()(int&& a, char&& b, double&& c) const { | |||||
| std::cout << typeid(T).name() << " " << a << " " << b << " " << c << std::endl; | |||||
| } | } | ||||
| }; | }; | ||||
| class bla {}; | |||||
| template<> template<typename T> | |||||
| void Dispatcher<bla, int, char, double>::call(int&& a, char&& b, double&& c) { | |||||
| std::cout << typeid(T).name() << " " << a << " " << b << " " << c << std::endl; | |||||
| } | |||||
| main() { | main() { | ||||
| std::cout << "main()" << std::endl; | std::cout << "main()" << std::endl; | ||||
| Dispatcher<bla, int, char, double> d; | |||||
| d.dispatch(5, 1, 'a', 5.5); | |||||
| d.dispatch(-5, 1, 'a', 5.5); | |||||
| //bla<double>()(1, 'a', 5.5); | |||||
| dispatch<bla, int, char, double>(5, 1, 'a', 5.5); | |||||
| dispatch<bla, int, char, double>(-5, 1, 'a', 5.5); | |||||
| } | } | ||||