2009-10-03 49 views
2

我想綁定operator new(請參閱下面的示例)。如果構造函數沒有任何參數,它可以正常工作,但如果它有參數,我顯然無法獲得正確的綁定語法。綁定運算符new?

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

回答

4

這應該這樣做:

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

哦。衛生署。我可以發誓我曾嘗試過。謝謝。 – drby 2009-10-03 18:09:05

4

爲什麼不直接寫以下?我看不出有什麼理由在你的情況下使用bind

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

哦,是的。由於我使用傳遞方法函數對象很多,我沒有意識到在這種情況下甚至不需要綁定。儘管如此,如果你有幾個參數給構造函數,並且你想綁定其中的一些,你會再次需要它。所以我接受了更一般的解決方案。不過,謝謝你指出。 – drby 2009-10-04 08:08:40