如何设置和使用 std::map<void*, MyClass*>
How do I setup and use std::map<void*, MyClass*>
我有一个程序,其中包含一组输入和一组输出变量,我使用XML与Apache/PHP网页交换。用户可以在网页上查看已配置/正在发生的内容,并可以更改设置。
当我将XML传递给PHP程序(我们使用Unix_domain套接字)时,我添加了很多关于我传递给他的设置和指标的元信息。 诸如数据类型、最小值、最大值、默认值、读/写权限等。
<temperature datatype="INT32" min=-"40" max="150" permissions="R/O">25</temperature>
在构建出站 xml 时,我需要知道有关每个变量的元数据。 我虽然这样做的一个好方法是创建一个类 VarInfo,我将它与每个变量相关联。 为了将变量名称存储为映射中的键(不确定我是否总是知道变量名称),我想让键成为指向变量的指针,值是指向该变量的 VarInfo 对象的指针。 我知道存储混合指针类型的唯一方法是将它们全部转换为 void*。 所以,像这样:
bool cmpr( void* a, void*b) { return (long)a < (long)b;};
std::map<void*,VarInfo*,cmpr> VarMap;
int temperature;
VarInfo vi_temperature;
VarMap[(void*)&temperature] = &vi_temperature;
这样做会产生一堆关于声明地图的错误。
expected a type, got ‘cmpr’ ACT_iod.cpp
Invalid template arguments ACT_iod.cpp line 40 Semantic Error
invalid type in declaration before ‘;’ token
type/value mismatch at argument 3 in template parameter list for
‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’
那么,有人可以建议我如何让它工作,并且可能还建议一种更好的方法来存储元信息吗? 仍在考虑更改为 std::string 作为键。
谢谢。
std::map
的第三个参数应该是比较器的类型。作为一个修复程序,你可以cmpr
函子(由于其内在性,这通常是首选的aproach):
struct cmpr {
bool operator()(void* a, void* b) {...}
}
std::map<void*,VarInfo*,cmpr> VarMap;
另一种选择是使用函数指针的类型(bool(*)(void*, void*)
iirc),并将指向实际使用的函数的指针作为构造函数的参数:
bool cmpr( void* a, void*b) { return (intptr_t)a < (intptr_t)b;}
std::map<void*,VarInfo*,bool(*)(void*, void*)> VarMap(&cmpr);
编辑:现在我想到了:指针的默认比较无论如何都是<
,所以你可以只使用std::map<void*, VarInfo*>
,它的好处是更便携。通常,应避免将指针投向long
。尽可能避免指向整数转换的指针,否则使用 intptr_t
、uintptr_t
或 size_t
是一个更好的主意,因为long
不能保证足够大以容纳指针(在某些 64 位平台上,long 确实是 32 位)。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- EASTL矢量<向量<int>>连续的
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>