键入检查std :: map键和/或boost :: any类型的值?

时间:2017-06-22 00:52:02

标签: c++ boost boost-any

我正在编写帮助函数,将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;
}

我正在寻找更好的方法。

1 个答案:

答案 0 :(得分:2)

使用boost::any作为关联容器密钥非常不方便。对于有序容器,它必须支持operator<,对于无序 - operator==std::hash(或您选择的哈希)。您需要自己实现此功能,但boost::any不提供查询存储值类型的便捷方法。

对于键和值,理想的选择可能是boost::variant,因为DBUS has a limited number of types:整数,双精度,字符串;字典和变体可以使用递归boost::variant建模。

boost::variant实现所需的运算符非常简单:首先比较值类型,如果匹配,则比较值本身。