如何专门化容器的功能模板?

时间:2015-04-05 04:34:18

标签: c++ templates c++11

我有功能模板,可以将POD存储到流中:

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

有没有办法专门化容器的这个模板 存储容器大小然后调用一般实现 容器物品?

2 个答案:

答案 0 :(得分:3)

适用于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>());
}

答案 1 :(得分:0)

您只需要为每种容器类型专门化模板。例如,使用矢量。

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类型实例化模板。可能值得强制执行(尽管我会将其作为练习)。