2016-12-01 66 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 

有关它定义的所有类型的完整列表,请参阅每个容器的规范。

这就是你如何知道容器中有什么。