Следуя практике STL, я бы рекомендовал использовать два итератора для входных параметров вместо контейнера (по очевидной причине возможности работать только с частью контейнера и, как правило, с любой последовательностью, определенной итераторами):
template<typename InputIterator>
std::string convert2Str(InputIterator first, InputIterator last)
{
std::ostringstream sStream;
for (InputIterator it = first; it != last; ++it) {
sStream << *it << " ";
}
return sStream.str();
}
Если вам нужен тип содержащихся объектов, используйте
typedef typename std::iterator_traits<InputIterator>::value_type T;
ДОБАВЛЕНО: Затем вы можете использовать функцию следующим образом:
std::vector<int> int_vec;
std::list<float> f_list;
std::deque<std::string> str_deq;
// put something into the containers here
std::cout<< convert2Str(int_vec.begin(), int_vec.end()) <<std::endl;
std::cout<< convert2Str(f_list.begin(), f_list.end()) <<std::endl;
std::cout<< convert2Str(str_deq.begin(), str_deq.end()) <<std::endl;
Обратите внимание,не может перебрать std :: queue;но если вам это действительно нужно, стандарт гарантирует достаточную поддержку для самостоятельного решения.См. Дополнительную информацию здесь: std :: queue iteration .