Это рабочий пример,
template<typename T>
std::string JoinToString(const T& cont, const char* delim, std::string &str)
{
std::stringstream s;
T::const_iterator it= cont.begin();
T::const_iterator last= cont.end();
while(it != last)
{
s << (*it);
++it;
s << delim;
if (it == last)
break;
}
return s.str() + str;
}
int main()
{
std::string s("String! ");
std::vector<std::string> v(1, "String!, String!");
std::cout << JoinToString(v, ", ", s) << "\n";
std::list<std::string> l(1, "String!, String!");
std::cout << JoinToString(l, ", ", s);
}
Есть несколько вещей, на которые стоит обратить внимание.
Вы можете использовать template<template<class> class T
, хотя это может вызвать проблемы, в зависимости от количества аргументов шаблона, которое имеет контейнер.
Я хотел бы отметить (для дальнейшего использования), если вы хотите подключить тип к шаблону класса, например std :: string как аргумент шаблона в std :: vector самое безопасное решение,
template<class T>
struct something
{
typedef typename boost::mpl::apply<T, std::string>::type type;
};
something<std::vector<boost::mpl::placeholders::_1>>::type;
Причина, по которой это безопаснее, чем использование template<template<class> class T
, заключается в том, что он позволит больше настроек со стороны пользователя и будет работать с шаблонами классов с любым количеством аргументов / аргументов по умолчанию.