如何专门化容器的函数模板
How to specialize function template for a container?
我有一个函数模板,可以实现将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>());
}
您只需要为每个容器类型专门化模板。例如,使用向量。
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类型实例化模板。这可能值得强制执行(尽管我将把它作为练习)。
相关文章:
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 如何专门化模板构造函数模板
- 专门化采用通用引用参数的函数模板
- 使用decltype尾部返回类型专门化函数模板
- 为模板化派生类专门化函数模板
- 如何专门化容器的函数模板
- 显式函数模板专门化选择了错误的专门化
- C++模板-专门化函数
- 在单独的.cpp文件中专门化函数模板
- 成员和成员函数的模糊部分模板专门化
- C++中模板类的成员函数的专门化
- 如何专门化具有多个参数的函数模板
- 函数模板专门化
- 二进制搜索的一个函数模板专门化
- 当函数模板专门化到不同的命名空间时,GCC和clang不同意
- 构造函数模板专门化对析构函数给出了未定义的引用
- 用于派生特定类型的函数模板专门化
- 有没有一种方法可以为函数模板专门化命名类型
- 使用C调用约定调用函数模板专门化