dan*_*jar 2 c++ parameters types class function
在C++中有没有办法将类型(例如类)作为参数传递给函数?
解释为什么我需要这个:有一个抽象data类和一个manager类.的manager类包含一个列表(或在这种情况下,地图)的派生类的对象data.我unique_ptr在这个问题的答案中提到了这一点.
class Data{}; // abstract
class Manager
{
map<string, unique_ptr<Data>> List;
};
Run Code Online (Sandbox Code Playgroud)
现在想象一下,我想为data经理添加一个新的存储空间.
class Position : public Data
{
int X;
int Y;
}
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉经理创建一个这种类型的对象并引用unique_ptr它呢?
Manager manager;
manager.Add("position data", Position);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我需要将类传递Position给addmanager类的函数,因为我不想首先创建一个实例然后将其发送给管理器.
然后,我怎么能将该类的对象添加到List?
我不确定在C++中是否有这样做的方法.如果不能轻易完成,我真的希望看到一个解决方法.非常感谢!
您可以使用模板.在每种类型中,Data你必须定义一个'creator'函数,它具有以下原型:Derived* create().它将在内部调用(您也可以返回一个unique_ptr,但这需要更多内存).
例如:
struct Position: public Data
{
// ...
static Position* create()
{
return new Position();
}
};
Run Code Online (Sandbox Code Playgroud)
该Add方法是:
template<typename D>
void Add(String str)
{
List.insert(std::make_pair(str, std::unique_ptr<Data>(D::create())));
}
Run Code Online (Sandbox Code Playgroud)
然后你像这样使用它:
Manager manager;
manager.Add<Position>("position data");
Run Code Online (Sandbox Code Playgroud)
编辑
您还可以create使用此Add方法摆脱这些功能:
template<typename D>
void Add(String str)
{
List.insert(std::make_pair(str, std::unique_ptr<Data>(new D())));
}
Run Code Online (Sandbox Code Playgroud)
优点:数据结构代码中的代码更少.
不方便:数据结构对它们的构建方式的控制较少.
| 归档时间: |
|
| 查看次数: |
401 次 |
| 最近记录: |