我正在嘗試爲原型類型上模板化的STL容器實現序列化方法。C++模板編程/ STL推導參數
我該如何推斷,可以說,什麼鍵和值類型可以讓我們說一個無序的映射,以便我可以根據鍵/值類型實現適當的邏輯。
我知道模板元編程是這樣做的方式,但一個具體的例子將不勝感激。
我正在嘗試爲原型類型上模板化的STL容器實現序列化方法。C++模板編程/ STL推導參數
我該如何推斷,可以說,什麼鍵和值類型可以讓我們說一個無序的映射,以便我可以根據鍵/值類型實現適當的邏輯。
我知道模板元編程是這樣做的方式,但一個具體的例子將不勝感激。
這可能足以啓動您的項目。這個超棒的JSON序列化程序使用函數重載來處理每個要序列化的數據類型。 Serialize
過載爲unordered_map
,本身調用Serialize
來序列化每個包含對象的鍵和值。只需添加新的重載即可支持新的類型。
我做了一個改變了Serialize
過載,以前爲int
:現在,它演示瞭如何使編譯器會選擇這個重載任何算術類型,而不僅僅是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+谷歌的結果)。請自行研究,以便更好地瞭解您所問的內容,因爲在當前狀態下您的問題非常廣泛。 – mascoj
** RTFM **。該信息在模板定義中。 –
我投票結束這個問題作爲題外話,因爲它沒有顯示任何研究工作。 –