【问题标题】:Generic map objects通用地图对象
【发布时间】:2015-03-23 22:35:08
【问题描述】:

我正在尝试为 C++ 中的 SFML 创建一个资产管理器(很像 Libgdx 库中提供的那个)。但是我遇到了一个古老的问题,即模板是 C++ 中最糟糕的部分之一。

我试图让一个地图对象保存通用类型,键是一个简单的字符串,数据是我想要的任何类型。请注意,我不想将地图对象模板化为仅在整个地图中保存一种通用类型(IE,地图为<string, int>)。我想在同一个地图中有不同的类型,这样我就可以加载许多不同的资产。

有什么办法可以做这样的事情吗?

感谢您的帮助和考虑,任何小提示都会大有帮助。

【问题讨论】:

  • 好吧 the Boost Any library,或者当然使用继承和指针。但是您也可以重新考虑让一个资产管理器来处理所有资产的设计,而是为每种类型的资产使用一个管理器(并改为使用管理器的地图)。
  • 模板是 C++ 中最好的部分之一。至于你的问题你可以看看stackoverflow.com/questions/251403/…
  • 谢谢!今晚晚些时候我会检查一下,我想我的模板评论措辞错误。我的意思是,在我和大多数朋友的意见中,C++ 中的模板是最麻烦和最令人困惑的特性之一(尽管它们非常有用)。
  • 不能只使用继承吗? IE。从基类“资产”派生所有资产,然后您的地图看起来像 map
  • @Brad 不,我不能使用继承,这是因为我使用的是具有自己的自定义资产类的 SFML 库。因为我想加载所有不同类型的资产。 SFML 音频和图像资产不共享父类(这非常令人沮丧)。

标签: c++ sfml asset-management


【解决方案1】:

我重申我对使用经理地图进行重新设计的评论。

那么你可以有例如

class basic_asset_manager { ... };
class image_asset_manager : public basic_asset_manager { ... };
...

std::unordered_map<std::string, basic_asset_manager*> asset_managers;
asset_managers["image"] = new image_asset_manager;
...

// Load an image from a file
asset_managers["image"]->load("some alias for image", "/some/file/name");
...

// Get image
image = asset_manager["image"]->get("some alias for image");

也许不是完全这样,但希望你明白这一点。

【讨论】:

    【解决方案2】:

    您可以定义一个结构,或者在某些情况下可能使用一个联合作为映射的第二个参数。可能不是最优雅的解决方案,但可以完成工作。

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 2021-09-26
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多