我正在尝试为原型类型上模板化的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 **。该信息在模板定义中。 –
我投票结束这个问题作为题外话,因为它没有显示任何研究工作。 –