我有实现将 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>());
}
关于c++ - 如何专门化容器的功能模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29454109/