我有一个实现存储POD到流函数模板:如何专门化容器的函数模板?
template<typename T>
void dumps(std::ostream &os, const T &t)
{
os.write(reinterpret_cast<const char *>(&t), sizeof(t));
}
有没有办法专门这个模板容器 储存容器的大小,然后呼吁 集装箱中的物品一般执行?
我有一个实现存储POD到流函数模板:如何专门化容器的函数模板?
template<typename T>
void dumps(std::ostream &os, const T &t)
{
os.write(reinterpret_cast<const char *>(&t), sizeof(t));
}
有没有办法专门这个模板容器 储存容器的大小,然后呼吁 集装箱中的物品一般执行?
这适用于std::vector
,std::set
和std::list
。没有测试任何其他容器。
它也适用于POD类型。用int
和以下struct
进行测试。
struct A
{
int a;
double b;
};
// Forward declaration of the wrapper function.
template<typename T>
void dumps(std::ostream &os, const T &t);
// Implementation for POD types
template<typename T>
void dumps(std::ostream &os, const T &t, std::true_type)
{
os.write(reinterpret_cast<const char *>(&t), sizeof(t));
}
// Implementation for container types
template<typename T>
void dumps(std::ostream &os, const T &t, std::false_type)
{
auto size = std::distance(t.begin(), t.end());
os.write(reinterpret_cast<const char *>(&size), sizeof(size));
for (auto const& item : t)
{
dumps(os, item);
}
}
// Implementation of the wrapper function.
template<typename T>
void dumps(std::ostream &os, const T &t)
{
dumps(os, t, std::integral_constant<bool, std::is_pod<T>::value>());
}
问题是,对于POD类型的转储(),这不会很好。 – Peter 2015-04-05 05:00:46
@Peter的确如此。 – 2015-04-05 05:06:37
你只需要专注于每个容器类型的模板。例如,用一个矢量。
template<typename T>
void dumps(std::ostream &s, const typename std::vector<T> &t)
{
auto size = t.size();
s.write(<reinterpret_cast<const char *>(&size), sizeof(size);
for (auto const &item : t)
dumps(s, item); // using your dumps() for POD types
}
或(前C++ 11)
template<typename T>
void dumps(std::ostream &s, const typename std::vector<T> &t)
{
typename std::vector<T>::size_type size = t.size();
s.write(<reinterpret_cast<const char *>(&size), sizeof(size);
for (std::vector<T>::const_iterator item = t.begin(), end = t.end();
i != end; ++i)
dumps(s, *item); // using your dumps() for POD types
}
类似地,专门用于其他容器类型。然后它也将适用于容器的容器。
另外:这确实假设你不会为非POD类型实例化你的模板。这可能值得强制执行(尽管我将其作为练习)。
您应该能够为'void dumps(std :: ostream&os,const std :: vector&vec)'重载并适当地执行它......我认为您需要为每个容器执行此操作键入虽然。 –
VoidStar
2015-04-05 04:43:06