如果使用 std::map<std::string,object>
为了让对象按名称排序, map 的 value_type
( std::pair<string,object>
) 是一个方便的类,它保证了有用的功能,例如
typedef std::map<std::string,object> object_map;
typedef typename object_map::value_type named_object;
void function(named_object const&);
// with the following possible use case
void foo(std::string const&name, object_map const &omap)
{
auto obj=omap.find(name);
if(obj==omap.end()) throw std::runtime_error("name not found");
function(*obj);
}
到目前为止,还不错。我稍后扩展我的对象
struct extended_object : object { /* more data */ };
并通过 std::map<std::string,extended>
保持扩展对象按名称排序.
我可以定义。
typedef std::map<std::string,extended_object> extended_object_map;
typedef typename extended_object_map::value_type named_extended_object;
很遗憾,我不能
void foo(std::string const&name, extended_object_map const& emap)
{
auto eobj=emap.find(name);
if(eobj==emap.end()) throw std::runtime_error("name not found");
function(*eobj); // cannot convert *eobj to const named_object&
}
现在,我的问题是如何解决这个问题?我考虑过使用 reinterpret_cast<>
function(reinterpret_cast<const named_object&>(*eobj));
本质上假设 named_object
的数据布局和 named_extended_object
与 base 和 derived 完全一样。这安全/值得推荐吗?
或者,我考虑使用 std::set
(而不是 std::map
)与键类型
named_object
并重新定义
struct named_extended_object : named_object { /* more data */ };
这种方法的问题在于,为了 std::set::find()
一个对象,我必须提供的不仅仅是一个名称字符串,而是整个对象甚至扩展对象。根据cppreference , std::set::find()
将在 C++14 中解决此问题(重载 3 和 4),但同时我应该做什么?
最佳答案
将您的功能更改为
void function(const std::string& name, const object& obj);
然后像这样调用它
auto obj = omap.find(name);
function(obj->first, obj->second);
// or
auto eobj = emap.find(name);
function(eobj->first, eobj->second);
关于c++ - 哪个容器使用 map 或 set 或者其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407993/