2015-04-05 29 views
0

我有一个实现存储POD到流函数模板:如何专门化容器的函数模板?

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

有没有办法专门这个模板容器 储存容器的大小,然后呼吁 集装箱中的物品一般执行?

+1

您应该能够为'void dumps(std :: ostream&os,const std :: vector &vec)'重载并适当地执行它......我认为您需要为每个容器执行此操作键入虽然。 – VoidStar 2015-04-05 04:43:06

回答

3

这适用于std::vector,std::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>()); 
} 
+0

问题是,对于POD类型的转储(),这不会很好。 – Peter 2015-04-05 05:00:46

+0

@Peter的确如此。 – 2015-04-05 05:06:37

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