簡體   English   中英

如何專門化容器的功能模板?

[英]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::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類型實例化模板。 可能值得強制執行(盡管我將其保留為練習)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM