我正在编写帮助函数,将DBus
属性值转换为std类型。为此,要转换少数类型,我需要创建一个std::map
。该地图将代表DICT
中的DBus
类型。 DBUS
中的DICT类型可以将任何类型作为键,任何类型都可以作为值。现在,我需要将其转换为std::map
。我正在考虑将std::map<boost::any, boost::any>
用于DICT
类型的DBUS
。但是,在将所有类型的DBUS
转换为std类型后,我必须检查类型。但看起来我不能这样做,因为下面的程序失败了(显然):
#include <iostream>
#include <typeinfo>
#include <boost/any.hpp>
#include <map>
#include <string>
int main()
{
std::map<std::string, boost::any> m;
boost::any key = 2;
boost::any value = std::string("Hello");
m.insert(std::make_pair(std::string("Key"), value));
if (typeid(m) == typeid(std::map<std::string, std::string>))
std::cout << "Yes" << std::endl;
return 0;
}
我正在寻找更好的方法。
答案 0 :(得分:2)
使用boost::any
作为关联容器密钥非常不方便。对于有序容器,它必须支持operator<
,对于无序 - operator==
和std::hash
(或您选择的哈希)。您需要自己实现此功能,但boost::any
不提供查询存储值类型的便捷方法。
对于键和值,理想的选择可能是boost::variant
,因为DBUS has a limited number of types:整数,双精度,字符串;字典和变体可以使用递归boost::variant
建模。
为boost::variant
实现所需的运算符非常简单:首先比较值类型,如果匹配,则比较值本身。