0

我有一个带有一组输入和一组输出变量的程序,我使用 XML 与 Apache/PHP 网页进行交换。该网页是用户可以查看配置/正在进行的内容并可以更改设置的地方。

当我将 XML 传递给 PHP 程序(我们使用 Unix_domain Sockets)时,我添加了很多关于我传递给他的设置和指标的元信息。数据类型、最小值、最大值、默认值、读/写权限等。

<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's作为key。

谢谢。

4

1 回答 1

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_torsize_t是一个更好的主意,因为long不能保证足够大以容纳指针(并且 long 在某些 64 位平台上确实是 32 位)。

于 2012-06-28T18:53:09.780 回答