2009-10-03 3 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

4

은 왜 그냥 다음을 작성? 귀하의 경우에 bind을 사용할 이유가 없습니다.

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

오, 예. 메소드 함수 객체를 많이 사용하기 때문에이 경우 바인드가 필요 없다는 것을 깨닫지 못했습니다. 그래도 생성자에 대한 인수가 여러 개 있고 그 중 일부를 바인딩하려는 경우 다시 필요합니다. 그래서 저는 좀 더 일반적인 해결책을 받아들입니다. 그래도 지적 해 주셔서 고마워요. – drby