#include using namespace std; template struct Lambda { const Functor f; Lambda( const Functor& f ): f(f) {} template T operator()( const T& x ) const { return f( x ); } }; struct Var { template T operator()( const T& x ) const { return x; } }; template <> struct Lambda< Var > { Var f; template T operator()( const T& x ) const { return x; } }; typedef Lambda< Var > ParamX; ParamX x; struct Adicao { template static A aplica( A a, B b ) { return a + b; } }; struct Multiplicacao { template static A aplica( A a, B b ) { return a * b; } }; struct Subtracao { template static A aplica( A a, B b ) { return a - b; } }; struct Divisao { template static A aplica( A a, B b ) { return a / b; } }; template class Oper { private: const A a; const B b; public: Oper( const A& a, const B& b ): a(a), b(b) {} template T operator()( const T& x ) const { return O::aplica( a(x), b(x) ); } }; template class Constante { private: const C n; public: Constante( const C& n ): n(n) {} template C operator()( const T& ) const { return n; } }; // Lambda e Lambda template inline Lambda< Oper< Adicao, A, B > > operator + ( const Lambda& a, const Lambda& b ) { return Oper< Adicao, A, B >( a.f, b.f ); } template inline Lambda< Oper< Multiplicacao, A, B > > operator * ( const Lambda& a, const Lambda& b ) { return Oper< Multiplicacao, A, B >( a.f, b.f ); } template inline Lambda< Oper< Subtracao, A, B > > operator - ( const Lambda& a, const Lambda& b ) { return Oper< Subtracao, A, B >( a.f, b.f ); } template inline Lambda< Oper< Divisao, A, B > > operator / ( const Lambda& a, const Lambda& b ) { return Oper< Divisao, A, B >( a.f, b.f ); } // Lambda e Constante template inline Lambda< Oper< Adicao, A, Constante > > operator + ( const Lambda& a, const B& b ) { return Oper< Adicao, A, Constante >( a.f, b ); } template inline Lambda< Oper< Adicao, Constante, A > > operator + ( const A& a, const Lambda& b ) { return Oper< Adicao, Constante, A >( a, b.f ); } template inline Lambda< Oper< Multiplicacao, A, Constante > > operator * ( const Lambda& a, const B& b ) { return Oper< Multiplicacao, A, Constante >( a.f, b ); } template inline Lambda< Oper< Multiplicacao, Constante, A > > operator * ( const A& a, const Lambda& b ) { return Oper< Multiplicacao, Constante, A >( a, b.f ); } template inline Lambda< Oper< Subtracao, A, Constante > > operator - ( const Lambda& a, const B& b ) { return Oper< Subtracao, A, Constante >( a.f, b ); } template inline Lambda< Oper< Subtracao, Constante, A > > operator - ( const A& a, const Lambda& b ) { return Oper< Subtracao, Constante, A >( a, b.f ); } template inline Lambda< Oper< Divisao, A, Constante > > operator / ( const Lambda& a, const B& b ) { return Oper< Divisao, A, Constante >( a.f, b ); } template inline Lambda< Oper< Divisao, Constante, A > > operator / ( const A& a, const Lambda& b ) { return Oper< Divisao, Constante, A >( a, b.f ); } template void imprime( int a, int b, Functor f ) { for( int i = a; i <= b; i++ ) cout << f(i) << " "; cout << endl; } int main(int argc, char *argv[]) { imprime( 0, 10, x*x + x + 1 ); system("PAUSE"); return EXIT_SUCCESS; }