code_junkie

Passing boost::any to results of boost::bind

Nov 12th, 2011
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. template <typename Bound>
  2. Bound::result_type callFromAnyList(Bound b, list<any> p)
  3. {
  4. }
  5.  
  6. double myFunc(string s, int i)
  7. {
  8. return -3.0;
  9. }
  10.  
  11. list<any> p;
  12. p.push_back((string)"Hello");
  13. p.push_back(7);
  14. double result = callFromAnyList(bind(myFunc, _1, _2), p);
  15.  
  16. template<typename>
  17. struct return_of;
  18.  
  19. template<typename R>
  20. struct return_of<R(*)()> {
  21. typedef R type;
  22. };
  23.  
  24. template<typename R, typename P1>
  25. struct return_of<R(*)(P1)> {
  26. typedef R type;
  27. typedef P1 parameter_1;
  28. };
  29.  
  30. void foo(int);
  31.  
  32. template<typename Func>
  33. typename return_of<Func>::parameter_1 bar(Func f) {
  34. return 42;
  35. }
  36.  
  37. // call: bar(foo);
  38.  
  39. void invoke(void (f)(), list<any>& params)
  40. {
  41. f();
  42. }
  43.  
  44. template <typename R>
  45. void invoke(R (f)(), list<any>& params)
  46. {
  47. params.push_front(f());
  48. }
  49.  
  50. template <typename T0>
  51. void invoke(void (f)(T0), list<any>& params)
  52. {
  53. T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
  54. f(t0);
  55. }
  56.  
  57. template <typename R, typename T0>
  58. void invoke(R (f)(T0), list<any>& params)
  59. {
  60. T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
  61. params.push_front(f(t0));
  62. }
  63.  
  64. template <typename T0, typename T1>
  65. void invoke(void (f)(T0, T1), list<any>& params)
  66. {
  67. T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
  68. T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
  69. f(t0, t1);
  70. }
  71.  
  72. template <typename R, typename T0, typename T1>
  73. void invoke(R (f)(T0, T1), list<any>& params)
  74. {
  75. T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
  76. T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
  77. params.push_front(f(t0, t1));
  78. }
  79.  
  80. template <typename T0, typename T1, typename T2>
  81. void invoke(void (f)(T0, T1, T2), list<any>& params)
  82. {
  83. T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
  84. T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
  85. T2 t2 = any_cast<T2>(*params.begin()); params.pop_front();
  86. f(t0, t1, t2);
  87. }
  88.  
  89. template <typename R, typename T0, typename T1, typename T2>
  90. void invoke(R (f)(T0, T1, T2), list<any>& params)
  91. {
  92. T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
  93. T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
  94. T2 t2 = any_cast<T2>(*params.begin()); params.pop_front();
  95. params.push_front(f(t0, t1, t2));
  96. }
Add Comment
Please, Sign In to add comment