03.12.2012 Views

C++ for Scientists - Technische Universität Dresden

C++ for Scientists - Technische Universität Dresden

C++ for Scientists - Technische Universität Dresden

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

114 CHAPTER 4. GENERIC PROGRAMMING<br />

}<br />

private:<br />

double parameter ;<br />

} ;<br />

int main() {<br />

para sin plus cos sin 1( 1.0 ) ;<br />

std::cout ≪ finite difference( sin 1, 1., 0.001 ) ≪ std::endl ;<br />

std::cout ≪ finite difference( para sin plus cos(2.0), 1., 0.001 ) ≪ std::endl ;<br />

std::cout ≪ finite difference( para sin plus cos(2.0), 0., 0.001 ) ≪ std::endl ;<br />

}<br />

4.8.2 Functors via generic programming<br />

If we make the functor argument in finite difference generic, we do not need a functor base<br />

any longer. There is also no need to alter our previously defined functors sin plus cos and<br />

para sin plus cos. This is a perfect example of the fact that using generic programming makes<br />

extending software easier. The program now looks like:<br />

#include <br />

#include <br />

template <br />

T inline finite difference(F const& f, const T& x, const T& h)<br />

{<br />

return ( f(x+h) − f(x) ) / h ;<br />

}<br />

class para sin plus cos<br />

{<br />

public:<br />

para sin plus cos(double p) : parameter(p) {}<br />

double operator() ( double x ) const<br />

{<br />

return sin( parameter ∗ x ) + cos(x);<br />

}<br />

private:<br />

double parameter;<br />

};<br />

int main()<br />

{<br />

para sin plus cos sin 1( 1.0 ) ;<br />

std::cout ≪ finite difference( sin 1, 1., 0.001 ) ≪ std::endl ;<br />

std::cout ≪ finite difference( para sin plus cos(2.0), 1., 0.001 ) ≪ std::endl ;<br />

std::cout ≪ finite difference( para sin plus cos(2.0), 0., 0.001 ) ≪ std::endl ;<br />

}<br />

return 0;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!