如何设置和使用std :: map <void *,myclass * =“”> </void *,>

时间:2012-06-28 18:36:31

标签: c++ stdmap

我有一个程序,其中包含一组输入和一组out变量,我使用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作为关键。

感谢。

1 个答案:

答案 0 :(得分:3)

std::map的第三个参数应该是比较器的类型。作为一个修复,你可以使cmpr成为一个仿函数(由于其不可靠性,它通常是首选方法):

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位平台上确实是32位)。