Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过捕获变量的lambda创建对象_C++_C++11_Lambda - Fatal编程技术网

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

C++ 通过捕获变量的lambda创建对象,c++,c++11,lambda,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

我有这门课:

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

并在构造后通过“init(int,std::vector*)”函数初始化对象,该函数实际上将复制构造函数完成的初始化工作,但这是第二种方法。

它不应编译。只有不捕获任何内容的lambda才能转换为普通的指针指向函数。您可以让lambda将
tileSize
pTilesets
(或
LevelParser*
指针)作为参数,而不是捕获它们,然后将它们传递给
t
的构造函数,就像您现在尝试的那样。只需更改
pFunc
的定义。请注意,您没有捕获成员变量。你正在捕捉这个。您最好通过值来捕获它,因为它是函数的局部。。
layerFactory[layerName] = [] () -> LayerABC* {return new T(); };