2017-06-22 16 views
0

DBusプロパティ値を標準型に変換するヘルパー関数を作成しています。そのために、いくつかのタイプを変換するには、std::mapを作成する必要があります。地図はDICTのタイプをDBusに表します。 DBUSのDICTタイプは、任意のタイプをキーとし、任意のタイプをその値として持つことができます。今、それをstd::mapに変換する必要があります。私はDICTタイプのstd::map<boost::any, boost::any>DBUSに使用することを考えています。しかし、すべてのタイプのDBUSをstdタイプに変換した後にタイプをチェックする必要があります。しかし、それはプログラムが以下の(明らかに)失敗したとして、私はそれを行うことはできませんようになっています。私はそれを行うには良い方法を探していますキーの型および/またはタイプboost :: anyの値のstd :: mapの型チェック?

#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は、この機能を自分で実装する必要がありますが、格納された値の型を照会する便利な方法はありません。

DBUS has a limited number of types:整数、倍精度の文字列であるため、キーと値の両方に対して、おそらくboost::variantが選択されます。辞書やバリアントは再帰的にboost::variantでモデル化できます。

boost::variantに必要な演算子を実装するのは簡単です。最初に値の型を比較し、一致する場合は値自体を比較します。

関連する問題