2017-06-22 3 views
0

J'écris des fonctions auxiliaires qui convertissent les valeurs de propriétés DBus en types std. Pour cela, pour convertir peu de type, j'ai besoin de créer un std::map. La carte représentera DICT tapez DBus. Le type DICT dans DBUS peut avoir n'importe quel type comme une clé et n'importe quel type comme valeur. Maintenant, je dois le convertir en std::map. Je pense à utiliser std::map<boost::any, boost::any> pour DICT type de DBUS. Cependant, je dois vérifier le type après la conversion de tous les types de DBUS en types std. Mais il semble que je ne peux pas le faire comme le programme échoue ci-dessous (évidemment):Vérification de type de la commande std :: map des clés et/ou des valeurs de type boost :: any?

#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; 
} 

Je cherche une meilleure façon de le faire.

Répondre

2

L'utilisation de boost::any comme clé de conteneur associative est plutôt incommode. Pour les conteneurs commandés, il doit prendre en charge operator<, pour unordered - operator== et std::hash (ou un hachage de votre choix). Vous devez implémenter cette fonctionnalité vous-même mais boost::any ne constitue pas un moyen pratique d'interroger le type de la valeur stockée.

Un choix idéal est probablement boost::variant pour la clé et les valeurs, puisque DBUS has a limited number of types: entiers, double, chaîne; les dictionnaires et les variantes peuvent être modélisés avec boost::variant récursif.

L'implémentation des opérateurs requis pour boost::variant est simple: comparez d'abord le type de valeur et, s'ils correspondent, la valeur elle-même.