Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::lambda and math functions
From: Roman Perepelitsa (roman.perepelitsa_at_[hidden])
Date: 2009-11-24 05:33:18


2009/11/24 Peter Foelsche <peter_foelsche_at_[hidden]>

> I've the following template function:
>
>
> template<typename T>
> T exp2(const T T0_d)
> { return exp(0.5*T0_d) + 2*exp(T0_d);
> }
>
>
> I want to define this as a lambda function in place (but don't know how).
>
> It will be used with T=double and T=MyAutomaticDerivativeClass.

#include <cmath>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

int main() {
  using namespace boost::lambda;
  double res = (bind(exp, 0.5 * _1) + 2 * bind(exp, _1))(0.5);
}

If exp is overloaded (and I guess it is, because you are going to pass both
double and MyAutomaticDerivativeClass as arguments to exp), you'll need to
wrap it in a polymorphic function object.

struct Exp {
  template <class Args>
  struct sig : boost::tuples::element<1, Args> {};

  template <class T>
  T operator()(T arg) const {
    return exp(arg);
  }
};

int main() {
  using namespace boost::lambda;
  double res = (bind(Exp(), 0.5 * _1) + 2 * bind(Exp(), _1))(0.5);
}

By the way, if you have a choice, I recommend using phoenix instead of
lambda. It can do everything lambda can do and even more.

Roman Perepelitsa.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net