如何设置和使用 std::map<void*, MyClass*>

How do I setup and use std::map<void*, MyClass*>

本文关键字:gt map lt MyClass void std 何设置 设置      更新时间:2023-10-16

我有一个程序,其中包含一组输入和一组输出变量,我使用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_tuintptr_tsize_t 是一个更好的主意,因为long不能保证足够大以容纳指针(在某些 64 位平台上,long 确实是 32 位)。