fork download
  1. #include <iostream>
  2. #include <functional>
  3. #include <string>
  4. #include <sstream>
  5.  
  6. struct Variant
  7. {
  8. template<typename T>
  9. explicit Variant(T x) { std::stringstream ss; ss << x; impl = ss.str(); }
  10.  
  11. std::string impl;
  12. };
  13.  
  14. template<typename T>
  15. T cast(Variant v) { std::stringstream ss(v.impl); T t; ss >> t; return t; }
  16.  
  17. namespace details
  18. {
  19. template<typename...T>struct Aux;
  20.  
  21. template<typename H, typename...T>
  22. struct Aux<H, T...> : Aux<T...>
  23. {
  24. template<typename F, typename... A>
  25. Aux(F f, Variant* args, A... a) : Aux<T...>(f, args + 1, a..., cast<H>(*args)) {}
  26. };
  27.  
  28. template<>
  29. struct Aux<>
  30. {
  31. template<typename F, typename... A>
  32. Aux(F f, Variant* args, A... a) { f(a...); }
  33. };
  34. }
  35.  
  36. template<typename... Ts>
  37. void invoke(std::function<void(Ts...)> f, Variant* args)
  38. {
  39. details::Aux<Ts...>{f, args};
  40. }
  41.  
  42. int main()
  43. {
  44. std::function<void(int, double, std::string)> test = [](int a, double b, std::string c)
  45. {
  46. std::cout << "a=" << a << '\n';
  47. std::cout << "b=" << b << '\n';
  48. std::cout << "c=" << c << '\n';
  49. };
  50.  
  51. Variant a[] = {Variant("20"), Variant("1.5"), Variant("x")};
  52. invoke(test, a);
  53. }
  54.  
Success #stdin #stdout 0s 3072KB
stdin
Standard input is empty
stdout
a=20
b=1.5
c=x