2016-12-01 99 views
0

我正在嘗試爲原型類型上模板化的STL容器實現序列化方法。C++模板編程/ STL推導參數

我該如何推斷,可以說,什麼鍵和值類型可以讓我們說一個無序的映射,以便我可以根據鍵/值類型實現適當的邏輯。

我知道模板元編程是這樣做的方式,但一個具體的例子將不勝感激。

+0

有分散在互聯網上的模板設計的許多,許多例子(C++模板示例具有500,000+谷歌的結果)。請自行研究,以便更好地瞭解您所問的內容,因爲在當前狀態下您的問題非常廣泛。 – mascoj

+1

** RTFM **。該信息在模板定義中。 –

+1

我投票結束這個問題作爲題外話,因爲它沒有顯示任何研究工作。 –

回答

1

這可能足以啓動您的項目。這個超棒的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} 
+0

正是我在尋找的非常感謝你:) – PYA

1

容器定義了typedef,它描述了它們的內容。

如果T是地圖,多重映射,一組或一個多集,以及它們的無序的口味,就像你有一個

T::iterator 

T::const_iterator 

你也有一個

T::key_type 

T::value_type 

有關它定義的所有類型的完整列表,請參閱每個容器的規範。

這就是你如何知道容器中有什麼。