#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator> 
#include<boost/lambda/lambda.hpp>
#include<boost/lambda/bind.hpp>
using namespace boost::lambda;


#include<iostream>
#include<functional>
#include<ext/functional>
#include<cmath>


class Cov:public std::binary_function<double,double,double> {
  const double _ax,_ay,_axy;
public: 
  Cov(double ax,double ay,double axy):_ax(ax),_ay(ay),_axy(axy) {};
  double operator()(double x,double y) const {return _ax*x*x+_ay*y*y+_axy*x*y;}
};



main() {

  Cov f(1.0,2.0,2.0);
  
  std::cout<<f(1.0,1.0)<<"\n";
  std::cout<<f(1.0,2.0)<<"\n";
  double x=1;
  std::cout<<bind(f,1.0,_1)(x)<<"\n";
  std::cout<<bind(f,1.0,_1)(make_const(2.0))<<"\n";


  std::cout<<bind(exp,-bind(f,_1,_2))(x,x)<<"\n";
}


