可以将数据传递到void指针而不指向变量的指针

时间:2014-04-06 20:50:11

标签: c++ pointers stl attributes void-pointers

很抱歉,如果标题有点令人困惑,但我有一个关于我的实体属性系统的问题。

注册属性后,将其放入此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);

我不想制作指向数据的指针,因为它令人烦恼且只是臃肿的代码。有没有办法达到我想要的目的?

谢谢!

2 个答案:

答案 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::variantboost::any之类的内容在地图中创建更常规的值类型。