fork(1) download
  1. #define _USE_MATH_DEFINES
  2.  
  3. #include <iostream>
  4. #include <cmath>
  5. #include <functional>
  6.  
  7. using namespace std;
  8.  
  9. #define MIN -10.
  10. #define MAX 10.
  11. #define EPS 0.01
  12.  
  13. template <typename T, class F> T trapezoid(F f, T a, T b, T eps) {
  14. T result = T(0);
  15. while (a <= b) {
  16. result += f(a);
  17. a += eps;
  18. }
  19. result -= (f(a) + f(b)) / T(2);
  20. return result * eps;
  21. }
  22.  
  23. template <class F>
  24. double splot(F g, F l, double x, double sigma, double gamma) {
  25. //template <class F1, class F2>
  26. //double splot(F1 g, F2 l, double x, double sigma, double gamma) {
  27.  
  28. cout << typeid(g).name()<<" vs." <<typeid(g).name()<<endl;
  29.  
  30. auto s = [g, l, x, sigma, gamma](double x_prime)->double {
  31. return g(x_prime, sigma) * l(x - x_prime, gamma);
  32. };
  33.  
  34. return trapezoid(s, MIN, MAX, EPS);
  35. }
  36.  
  37. int main (void) {
  38. double x = 0., sigma = 1.5, gamma = 0.1;
  39.  
  40. auto gauss = [](double x, double sigma)->double {
  41. return exp(-1*x*x / (2*sigma*sigma)) / (sigma * sqrt(2*M_PI));
  42. };
  43.  
  44. auto lorentz = [](double x, double gamma)->double {
  45. return gamma / (M_PI*(x*x + gamma*gamma));
  46. };
  47.  
  48. cout << "x: " << x << endl << "V(x): " <<
  49. splot(gauss, lorentz, x, sigma, gamma) << endl;
  50.  
  51. return 0;
  52. }
Compilation error #stdin compilation error #stdout 0s 15232KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:49:43: error: no matching function for call to ‘splot(main()::<lambda(double, double)>&, main()::<lambda(double, double)>&, double&, double&, double&)’
      splot(gauss, lorentz, x, sigma, gamma) << endl;
                                           ^
prog.cpp:24:8: note: candidate: template<class F> double splot(F, F, double, double, double)
 double splot(F g, F l, double x, double sigma, double gamma) {
        ^~~~~
prog.cpp:24:8: note:   template argument deduction/substitution failed:
prog.cpp:49:43: note:   deduced conflicting types for parameter ‘F’ (‘main()::<lambda(double, double)>’ and ‘main()::<lambda(double, double)>’)
      splot(gauss, lorentz, x, sigma, gamma) << endl;
                                           ^
stdout
Standard output is empty