2016-12-01 2 views
0

プリミティブ型をテンプレートにしたSTLコンテナのシリアル化メソッドを実装しようとしています。C++テンプレートプログラミング/ STL演繹パラメータ

キーと値の型に応じて適切なロジックを実装できるように、どのようなキーと値の型を推論することができますか。

私はテンプレートのメタプログラミングがこれを行う方法だと知っていますが、具体的な例は非常に高く評価されます。

+0

は、インターネット上に散在テンプレートデザインの多く、多くの例があります(C++テンプレートの例は、500,000 Googleの検索結果を持っています)。あなたの質問が非常に幅広い現在の状態では、あなたが求めていることのより良い考えを得るためにあなた自身で研究してください。 – mascoj

+1

** RTFM **。その情報はテンプレート定義にあります。 –

+1

私は何の研究努力もしていないので、この質問をトピックとして閉じようとしています。 –

答えて

1

これは、プロジェクトを急増させるのに十分かもしれません。この優れたJSONシリアライザは、関数のオーバーロードを使用して、シリアル化する各データ型を処理します。 unordered_mapの場合はSerializeオーバーロードであり、それ自体がSerializeを呼び出して、含まれている各オブジェクトのキーと値をシリアル化します。新しいタイプは、新しいオーバーロードを追加するだけでサポートできます。

私は以前intため、Serialize過負荷を変更した。今では、コンパイラは任意の算術型だけでなく、intため、このオーバーロードを選択してタイプの特性ライブラリを使用する方法を示します。

#include <iostream> 
#include <type_traits> 
#include <unordered_map> 
#include <string> 

std::string Serialize(std::string s) { 
    return '"' + s + '"'; 
} 

template < 
    typename T, 
    typename = typename std::enable_if<std::is_arithmetic<T>::value>::type 
> 
std::string Serialize(T n) { 
    return std::to_string(n); 
} 

template <typename Key, typename Val, typename ...Other> 
std::string Serialize(typename std::unordered_map<Key, Val, Other...> const &um) { 
    std::string result = "{"; 
    bool comma = false; 
    for(const auto& kv : um) { 
     if(comma) { result += ','; } 
     else  { comma = true; } 
     result += Serialize(kv.first); 
     result += ':'; 
     result += Serialize(kv.second); 
    } 
    result += '}'; 
    return result; 
} 

int main() { 
    std::unordered_map<std::string, int> mymap; 
    mymap["one"] = 1; 
    mymap["two"] = 2; 

    auto serialized = Serialize(mymap); 
    std::cout << serialized << '\n'; 
} 

出力

{"two":2,"one":1} 
+0

私が探していたものはまさにあなたにとても感謝しています:) – PYA

1

コンテナは、内容を記述するtypedefを定義します。

Tはマップ、マルチマップ、セット、またはマルチセット、並びにそれらの順不同の味、である場合は、

T::iterator 

T::const_iterator 

を持っているだけのようにあなたも持っています

T::key_type 

T::value_type 

定義されているすべてのタイプの完全なリストについては、各コンテナの仕様を参照してください。

これは、コンテナの内容を知る方法です。

関連する問題