fork download
  1. #include <iostream>
  2. #include <iostream>
  3. #include <math.h>
  4.  
  5. template< class T, class Op >
  6. struct Wrapper
  7. {
  8. Wrapper():t(nullptr){}
  9. Wrapper( T* ptrT ):t(ptrT){}
  10. Wrapper( Wrapper const& ) = default;
  11. Wrapper& operator=( Wrapper const& ) = default;
  12.  
  13. template<class...Args>
  14. auto operator()(Args&&...args) const->decltype( Op{}(std::declval<T*>(),std::declval<Args>()...)) {
  15. return Op{}(t, std::forward<Args>(args)...);
  16. }
  17. T* t;
  18. };
  19.  
  20. template< class T, bool isConst, class Sig >
  21. struct MemberFunc;
  22. template< class T, class R, class... Args >
  23. struct MemberFunc<T, false, R(Args...) > {
  24. template< R(T::*func)(Args...) >
  25. struct type {
  26. template<class... Ts>
  27. R operator()(T* t, Ts&&...ts) const {
  28. return (t->*func)(std::forward<Ts>(ts)...);
  29. }
  30. };
  31. };
  32. template< class T, class R, class... Args >
  33. struct MemberFunc<T, true, R(Args...) > {
  34. template< R(T::*func)(Args...) const >
  35. struct type {
  36. template<class... Ts>
  37. R operator()(T const* t, Ts&&...ts) const {
  38. return (t->*func)(std::forward<Ts>(ts)...);
  39. }
  40. };
  41. };
  42.  
  43. struct kernel
  44. {
  45. double gauss( double s )
  46. {
  47. return exp(-0.5*s*s);
  48. }
  49. };
  50.  
  51. int main()
  52. {
  53. kernel G;
  54.  
  55. Wrapper<kernel, MemberFunc<kernel, false, double(double)>::type<&kernel::gauss>> myKernel(&G);
  56.  
  57. std::cout<< myKernel(0.0) <<std::endl;
  58. std::cout<< myKernel(0.3) <<std::endl;
  59.  
  60. return 0;
  61. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
1
0.955997