2

我想绑定 operator 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

2 回答 2

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);
于 2009-10-03T18:01:09.190 回答
4

为什么不直接写以下?我看不出有任何理由bind在你的情况下使用。

factoryMap[BarType] = boost::lambda::new_ptr<Bar>();
factoryMap[BazType] = boost::lambda::new_ptr<Baz>();
于 2009-10-03T18:13:31.477 回答