如何使函数参数容器独立

2024-01-06

我正在编写一个实用函数,它将采用元素向量(可以是 string、int、double、char)并将其连接成单个字符串并返回它。它看起来像这样:

template<typename T>
std::string convert2Str(std::vector<T> const& vec) 
{
   std::ostringstream sStream; 
   for (size_t k=0; k<vec.size(); ++k) {
      sStream << vec[k] << " "; 
   }
   return sStream.str(); 
}

我想让这个函数更通用:

  • 首先使用迭代器而不是使用索引vector<T>。我试过这个std::vector<T>::const_iterator it = vec.begin()在循环之前,编译器给了我一个错误: :错误:预期;在它之前 当我将上面的定义更改为std::vector<std::string>::const_iterator it = vec.begin()错误消失。所以,看来我没有遵循正确的语法,请让我知道它是什么
  • 其次是通过使第一个参数容器独立来使函数更加通用。给定任何容器(vector, list, queue, deque等)我想做与上面相同的事情。我尝试在 stackoverflow 中搜索此内容,但没有找到满意的答案。

第1步,正如你所说,使用迭代器:

template<typename T>
std::string convert2Str(std::vector<T> const& vec) 
{
   typedef std::vector<T> container;
   std::ostringstream sStream; 
   for (typename container::const_iterator it = vec.begin(); it != vec.end(); ++it) {
      sStream << *it << " "; 
   }
   return sStream.str(); 
}

第 2 步,将模板参数设置为容器类型而不是元素类型(您可以使用以下命令返回元素类型)value_type:

template<typename container>
std::string convert2Str(container const& vec)
{
   typedef container::value_type T; // if needed
   std::ostringstream sStream; 
   for (typename container::const_iterator it = vec.begin(); it != vec.end(); ++it) {
      sStream << *it << " "; 
   }
   return sStream.str(); 
}

在 C++0x 中,这变得更加简单(并且typename不需要):

template<typename container>
std::string convert2Str(container const& vec)
{
   using std::begin;
   using std::end;
   std::ostringstream sStream;
   for (auto it = begin(vec); it != end(vec); ++it) {
      typedef decltype(*it) T; // if needed
      sStream << *it << " "; 
   }
   return sStream.str(); 
}

除其他优点外,std::begin and std::end适用于原始数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使函数参数容器独立 的相关文章

随机推荐