2009-10-03 4 views
2

Je voudrais lier l'opérateur new (voir l'exemple ci-dessous). Si le constructeur n'a pas d'arguments, cela fonctionne bien, mais s'il a des arguments, j'ai apparemment du mal à obtenir la syntaxe de liaison correcte.Opérateur de liaison nouveau?

#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; 
} 

Répondre

4

Cela devrait faire:

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); 
+0

Oh. Doh. J'aurais pu jurer d'avoir essayé ça avant. Merci. – drby

4

Pourquoi ne pas simplement d'écrire ce qui suit? Je ne vois aucune raison d'utiliser bind dans votre cas.

factoryMap[BarType] = boost::lambda::new_ptr<Bar>(); 
factoryMap[BazType] = boost::lambda::new_ptr<Baz>(); 
+0

Oh, ouais. Comme je travaille beaucoup avec les objets de fonction de méthode de passage, je n'ai pas réalisé que la liaison n'était même pas nécessaire dans ce cas. Cependant, si vous avez plusieurs arguments pour le constructeur et que vous voulez en lier quelques-uns, vous en aurez besoin à nouveau. Donc j'accepte la solution plus générale. Merci de l'avoir signalé. – drby