Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <type_traits>
- using namespace std;
- class X {
- public:
- double e( double v ) {
- return v;
- }
- double dx( double v ) {
- return 1;
- }
- };
- X x;
- class Cte {
- public:
- Cte( double c ): c(c) {}
- double e( double v ) {
- return c;
- }
- double dx( double v ) {
- return 0;
- }
- private:
- double c;
- };
- template <typename F1, typename F2>
- class Multiplica {
- public:
- Multiplica( F1 f1, F2 f2 ): f1(f1), f2(f2) {}
- double e( double v ) {
- return f1.e(v) * f2.e(v);
- }
- double dx( double v ) {
- return f1.e(v)*f2.dx(v) + f1.dx(v)*f2.e(v);
- }
- private:
- F1 f1;
- F2 f2;
- };
- template <typename F1, typename F2>
- class Soma {
- public:
- Soma( F1 f1, F2 f2 ): f1(f1), f2(f2) {}
- double e( double v ) {
- return f1.e(v) + f2.e(v);
- }
- double dx( double v ) {
- return f1.dx(v)+f2.dx(v);
- }
- private:
- F1 f1;
- F2 f2;
- };
- template <typename F1, typename F2>
- Multiplica<F1,F2> operator * ( F1 f1, F2 f2 ) {
- return Multiplica<F1,F2>( f1, f2 );
- }
- template <typename F2>
- Multiplica<Cte,F2> operator * ( double n, F2 f2 ) {
- return Multiplica<Cte,F2>( n, f2 );
- }
- template <typename F1>
- Multiplica<F1,Cte> operator * ( F1 f1, double n ) {
- return Multiplica<F1,Cte>( f1, n );
- }
- template <typename F1, typename F2>
- Soma<F1,F2> operator + ( F1 f1, F2 f2 ) {
- return Soma<F1,F2>( f1, f2 );
- }
- template <typename F2>
- Soma<Cte,F2> operator + ( double n, F2 f2 ) {
- return Soma<Cte,F2>( n, f2 );
- }
- template <typename F1>
- Soma<F1,Cte> operator + ( F1 f1, double n ) {
- return Soma<F1,Cte>( f1, n );
- }
- int main () {
- //auto f = sin(x);
- auto f = 3.0 * x * x;
- double v = 7;
- cout << "f(" << v << ")=" << f.e( v ) << ", f'(" << v << ")=" << f.dx( v ) << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment