2017-06-22 48 views
0

我正在編寫幫助函數,它將DBus屬性值轉換爲std類型。爲此,要轉換少數類型,我需要創建一個std::map。該地圖將代表DICT類型DBusDBUS中的DICT類型可以具有任何類型作爲鍵和任何類型的值。現在,我需要將其轉換爲std::map。我正在考慮使用std::map<boost::any, boost::any>代替DICT類型的DBUS。但是,我必須在將所有類型的DBUS轉換爲std類型之後檢查類型。但它看起來像我不能做到這一點,如下程序失敗(顯然):類型檢查密鑰的std :: map和/或類型爲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; 
} 

我正在尋找更好的方式來做到這一點。

回答

2

使用boost::any作爲關聯容器密鑰相當不方便。對於訂購的容器,它必須支持operator<,無序 - operator==std::hash(或您選擇的散列)。您需要自己實現此功能,但boost::any不提供查詢存儲值類型的便捷方式。

一個理想的選擇可能是boost::variant爲鍵和值,因爲DBUS has a limited number of types:整數,雙,字符串;字典和變體可以使用遞歸boost::variant進行建模。

實現boost::variant所需的運算符很簡單:首先比較值類型,如果它們匹配,則值本身。