我有一个程序,其中包含一组输入和一组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作为关键。
感谢。
答案 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_t
,uintptr_t
或size_t
是一个更好的主意,因为long
不能保证足够大以容纳指针(在某些64位平台上确实是32位)。