プリミティブ型をテンプレートにしたSTLコンテナのシリアル化メソッドを実装しようとしています。C++テンプレートプログラミング/ STL演繹パラメータ
キーと値の型に応じて適切なロジックを実装できるように、どのようなキーと値の型を推論することができますか。
私はテンプレートのメタプログラミングがこれを行う方法だと知っていますが、具体的な例は非常に高く評価されます。
プリミティブ型をテンプレートにしたSTLコンテナのシリアル化メソッドを実装しようとしています。C++テンプレートプログラミング/ STL演繹パラメータ
キーと値の型に応じて適切なロジックを実装できるように、どのようなキーと値の型を推論することができますか。
私はテンプレートのメタプログラミングがこれを行う方法だと知っていますが、具体的な例は非常に高く評価されます。
これは、プロジェクトを急増させるのに十分かもしれません。この優れた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}
私が探していたものはまさにあなたにとても感謝しています:) – PYA
コンテナは、内容を記述するtypedef
を定義します。
T
はマップ、マルチマップ、セット、またはマルチセット、並びにそれらの順不同の味、である場合は、
T::iterator
と
T::const_iterator
を持っているだけのようにあなたも持っています
T::key_type
と
T::value_type
定義されているすべてのタイプの完全なリストについては、各コンテナの仕様を参照してください。
これは、コンテナの内容を知る方法です。
は、インターネット上に散在テンプレートデザインの多く、多くの例があります(C++テンプレートの例は、500,000 Googleの検索結果を持っています)。あなたの質問が非常に幅広い現在の状態では、あなたが求めていることのより良い考えを得るためにあなた自身で研究してください。 – mascoj
** RTFM **。その情報はテンプレート定義にあります。 –
私は何の研究努力もしていないので、この質問をトピックとして閉じようとしています。 –