对 boost::any 类型的键 and/or 值的 std::map 进行类型检查?
Type checking of std::map of keys and/or values of type boost::any?
我正在编写将 DBus
属性值转换为标准类型的辅助函数。为此,要转换少数类型,我需要创建一个 std::map
。该地图将表示 DBus
中的 DICT
类型。 DBUS
中的 DICT 类型可以有任何类型作为键和任何类型作为它的值。现在,我需要将其转换为 std::map
。我正在考虑将 std::map<boost::any, boost::any>
用于 DICT
类型的 DBUS
。但是,我必须在将 DBUS
的所有类型转换为标准类型后检查类型。但看起来我做不到,因为下面的程序失败了(很明显):
#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;
}
我正在寻找更好的方法。
使用boost::any
作为关联容器键是相当不方便的。对于有序容器,它必须支持 operator<
,对于无序 - operator==
和 std::hash
(或您选择的散列)。您需要自己实现此功能,但 boost::any
不提供查询存储值类型的便捷方法。
键和值的理想选择可能是 boost::variant
,因为 DBUS has a limited number of types: integers, double, string; dictionaries and variants can be modelled with recursive boost::variant
。
实现 boost::variant
所需的运算符非常简单:首先比较值类型,如果它们匹配,则比较值本身。
我正在编写将 DBus
属性值转换为标准类型的辅助函数。为此,要转换少数类型,我需要创建一个 std::map
。该地图将表示 DBus
中的 DICT
类型。 DBUS
中的 DICT 类型可以有任何类型作为键和任何类型作为它的值。现在,我需要将其转换为 std::map
。我正在考虑将 std::map<boost::any, boost::any>
用于 DICT
类型的 DBUS
。但是,我必须在将 DBUS
的所有类型转换为标准类型后检查类型。但看起来我做不到,因为下面的程序失败了(很明显):
#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;
}
我正在寻找更好的方法。
使用boost::any
作为关联容器键是相当不方便的。对于有序容器,它必须支持 operator<
,对于无序 - operator==
和 std::hash
(或您选择的散列)。您需要自己实现此功能,但 boost::any
不提供查询存储值类型的便捷方法。
键和值的理想选择可能是 boost::variant
,因为 DBUS has a limited number of types: integers, double, string; dictionaries and variants can be modelled with recursive boost::variant
。
实现 boost::variant
所需的运算符非常简单:首先比较值类型,如果它们匹配,则比较值本身。