tags:

views:

179

answers:

2

I'd like to bind operator new (see example below). If the constructor doesn't have any arguments, it works fine, but if it does have arguments, I apparently have trouble getting the bind syntax correct.

#include <map>

#include <boost\function.hpp>
#include <boost\lambda\lambda.hpp>
#include <boost\lambda\construct.hpp>
#include <boost\lambda\bind.hpp>


enum TypeEnum
{
    BarType,
    BazType
};

class Foo
{

};

class Bar : public Foo
{
    public:
     Bar(int x)
     { BarVal = x; }

    private:
     int barVal;
};

class Baz : public Foo
{
    public:
     Baz(int x)
     { bazVal = 2 * x; }

    private:
     int bazVal;
};

class FooFactory
{
    public:
     FooFactory()
     {
      // How does this work?
      factoryMap[BarType] = boost::lambda::bind(boost::lambda::new_ptr<Bar>(_1));
      factoryMap[BazType] = boost::lambda::bind(boost::lambda::new_ptr<Baz>(_1));
     }

     Foo* getFoo(TypeEnum type, int z)
     {
      return factoryMap[type](z);
     }

    private:
     std::map<TypeEnum, boost::function<Foo* (int)>> factoryMap;
};

int main()
{   
    FooFactory fooFactory;

    Bar *newBar = static_cast<Bar*> (fooFactory.getFoo(BarType, 10));

    return 0;
}
+2  A: 

This should do:

 factoryMap[BarType] = boost::lambda::bind(boost::lambda::new_ptr<Bar>(), boost::lambda::_1);
 factoryMap[BazType] = boost::lambda::bind(boost::lambda::new_ptr<Baz>(), boost::lambda::_1);
Rüdiger Hanke
Oh. Doh. I could've sworn I tried that before. Thanks.
drby
+3  A: 

Why not just to write the following? I can't see any reason to use bind in your case.

factoryMap[BarType] = boost::lambda::new_ptr<Bar>();
factoryMap[BazType] = boost::lambda::new_ptr<Baz>();
Kirill V. Lyadvinsky
Oh, yeah. Since I work with passing method function objects around a lot, I didn't realize that bind wasn't even needed in this case. Still, if you have several arguments to the constructor and you want to bind a few of them, you'd need it again. So I'm accepting the more general solution. Thanks for pointing it out, though.
drby