Вы не можете напрямую ввести тип std :: vector в std :: string или наоборот. Но использование итераторов, предоставляемых контейнерами STL, позволяет вам одинаково перебирать вектор и строку. И если ваша функция требует произвольного доступа к рассматриваемому контейнеру, то либо будет работать.
std::vector<char> str1 {'a', 'b', 'c'};
std::string str2 = "abc";
template<typename Iterator>
void iterator_function(Iterator begin, Iterator end)
{
for(Iterator it = begin; it != end; ++it)
{
std::cout << *it << std::endl;
}
}
iterator_function(str1.begin(), str1.end());
iterator_function(str2.begin(), str2.end());
Оба этих последних двух вызова функций будут печатать одно и то же.
Теперь, если вы хотите написать общую версию, которая анализировала только символы, хранящиеся только в строке или в векторе, вы могли бы написать что-то, что итератировало внутренний массив.
void array_function(const char * array, unsigned length)
{
for(unsigned i = 0; i < length; ++i)
{
std::cout << array[i] << std::endl;
}
}
Обе функции будут делать то же самое в следующих сценариях.
std::vector<char> str1 {'a', 'b', 'c'};
std::string str2 = "abc";
iterator_function(str1.begin(), str1.end());
iterator_function(str2.begin(), str2.end());
array_function(str1.data(), str1.size());
array_function(str2.data(), str2.size());
Всегда существует множество способов решения проблемы. В зависимости от того, что у вас есть, любое количество решений может работать. Попробуйте оба и посмотрите, какая из них лучше подходит для вашего приложения.Если вы не знаете тип итератора, то используется итерация массива с символом. Если вы знаете, что у вас всегда будет тип шаблона для передачи, тогда метод шаблона шаблона может оказаться более полезным.
Это то, для чего были созданы итераторы. –
Вы задумывались над тем, чтобы сделать шаблон шаблоном? – mamahuhu
Опираясь на поведение капюшона класса, а не опубликованный интерфейс, может быть опасным. Какая потребность в этом? – Greg