У меня есть функция, в которой у меня есть контейнер, который содержит строки (например, vector<string>
, set<string>
, list<string>
) и, учитывая начальный итератор и конечный итератор, проходят через диапазон итераторов, обрабатывающих строки.
В настоящее время функция объявлена так:
template< typename ContainerIter>
void ProcessStrings(ContainerIter begin, ContainerIter end);
Теперь она будет принимать любой тип, который соответствует неявному интерфейсу реализации operator*
, префиксу operator++
и любым другим вызовам.в теле функции.
То, что я действительно хочу сделать, это иметь определение, подобное приведенному ниже, которое явно ограничивает объем ввода (предупреждение псевдокода):
template< typename Container<string>::iterator>
void ProcessStrings(Container<string>::iterator begin, Container<string>::iterator end);
, чтобы я могиспользуйте его так:
vector<string> str_vec;
list<string> str_list;
set<SomeOtherClass> so_set;
ProcessStrings(str_vec.begin(), str_vec.end()); // OK
ProcessStrings(str_list.begin(), str_list.end()); //OK
ProcessStrings(so_set.begin(), so_set.end()); // Error
По сути, я пытаюсь ограничить спецификацию функции, чтобы сделать ее понятной для пользователя, что она принимает, и если код не скомпилируется, они получаютсообщение о том, что они используют неправильные типы параметров, а не что-то в теле функции, что функция XXX не может быть найдена для класса XXX.