很抱歉,如果标题有点令人困惑,但我有一个关于我的实体属性系统的问题。
注册属性后,将其放入此unordered_map:
std::unordered_map<std::string, void*> m_attributes;
这是注册属性
的实现void registerAttribute(const std::string& id, void* data)
{
m_attributes[id] = data;
}
以及使用它的例子:
std::shared_ptr<int> health(new int(20));
registerAttribute("health", health.get());
我希望能够做到的是:
registerAttribute("health", 20);
我不想制作指向数据的指针,因为它令人烦恼且只是臃肿的代码。有没有办法达到我想要的目的?
谢谢!
答案 0 :(得分:2)
采取步骤来输入elision,你可能想要使用boost :: any:
#include <iostream>
#include <map>
#include <boost/any.hpp>
typedef std::map<std::string, boost::any> any_map;
int main(int argc, char *argv[]) {
any_map map;
map.insert(any_map::value_type("health", 20));
std::cout << boost::any_cast<int>(map.begin()->second) << '\n';
return 0;
}
答案 1 :(得分:0)
为了获取某些东西的地址以利用它作为void*
的指针,必须有一个可以使用的对象。 void*
的值只是保存数据的内存的地址。表达式20
不满足此要求,因为它的存储将在表达式之后消失。
根据地图中值的一般性,您可以简化值类型的声明。如果他们真的总是int
那么就使用它。否则,您可以考虑使用boost::variant
或boost::any
之类的内容在地图中创建更常规的值类型。