Оператор привязки новый? - PullRequest
       17

Оператор привязки новый?

2 голосов
/ 03 октября 2009

Я бы хотел связать оператор 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;
}

Ответы [ 2 ]

4 голосов
/ 03 октября 2009

Почему бы просто не написать следующее? Я не вижу причин использовать bind в вашем случае.

factoryMap[BarType] = boost::lambda::new_ptr<Bar>();
factoryMap[BazType] = boost::lambda::new_ptr<Baz>();
4 голосов
/ 03 октября 2009

Это должно сделать:

 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);
...