如何专门化容器的函数模板

How to specialize function template for a container?

本文关键字:函数模板 专门化      更新时间:2023-10-16

我有一个函数模板,可以实现将POD存储到流中:

template<typename T>
void dumps(std::ostream &os, const T &t)
{
    os.write(reinterpret_cast<const char *>(&t), sizeof(t));
}

有没有一种方法可以专门化这个容器模板存储容器大小,然后调用集装箱物品?

这适用于std::vectorstd::setstd::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类型实例化模板。这可能值得强制执行(尽管我将把它作为练习)。