通过捕获变量的lambda创建对象

时间:2015-09-28 15:24:51

标签: c++ c++11 lambda

我有这堂课:

class LevelParser  
{  
    private:
        int tileSize;
        std::vector<Tileset>* pTilesets;

        typedef LayerABC* (*pFunc)();

        std::unordered_map<std::string, pFunc> layerFactory;

        template <typename T>
        void registerLayer(std::string layerName);

        LayerABC* createLayer(std::string layerName);
};

template <typename T>
void LevelParser::registerLayer(std::string layerName)
{
    auto Iterator = layerFactory.find(layerName);

    if(Iterator != layerFactory.cend())
    {
        return;
    }

    layerFactory[layerName] = [&] () -> LayerABC* {return new T(tileSize, pTilesets); };
}

它编译好了,但是当通过工厂创建一个图层时,程序制动并且IDE指向我使用'registerLayer'函数的lambda行。

LevelParser类变量'tileSize'和'pTilesets'稍后在解析过程中和层创建发生之前初始化,这就是为什么它们是通过引用捕获的,这就是lambda应该工作的原因,但事实并非如此。

有谁知道出了什么问题?

P.S。
有一种解决方案可以避免将参数传递给层构造函数,如下所示:

layerFactory[layerName] = [] () -> LayerABC* {return new T(); };

并在构造之后通过'init(int,std :: vector&lt; Tileset&gt; *)'函数初始化对象,该函数实际上将复制构造函数完成的初始化作业 - 但这是第二个手段。

0 个答案:

没有答案