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