gpt4 book ai didi

c++ - 如何设置和使用 std::map

转载 作者:行者123 更新时间:2023-11-28 00:55:56 25 4
gpt4 key购买 nike

我有一个程序,其中包含一组输入变量和一组输出变量,我使用 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;

这样做会在声明 map 时产生一堆错误。

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。

谢谢。

最佳答案

std::map的第三个参数应该是比较器的类型。作为一种修复,您可以制作 cmpr一个仿函数(由于其 inlinablility 通常是首选方法):

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

关于c++ - 如何设置和使用 std::map<void*, MyClass*>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11250873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com