对 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 所需的运算符非常简单:首先比较值类型,如果它们匹配,则比较值本身。