Я пытаюсь реализовать функцию, которая позволяет пользователю вводить некоторый тип начального и конечного итераторов, а затем все они выполняют некоторые операции с данными. Однако функция должна быть достаточно общей, она должна работать для многих типов итераторов (например, std :: vector :: iterator
, std :: string :: iterator
, ] std :: iterator
и т. д.). Единственным ограничением является то, что итераторы должны иметь как минимум forward_iterator_tag
возможности.
Мой прототип функции выглядит так:
template <class key_type, class data_type> std::shared_ptr<data_type>
remove(std::iterator<std::forward_iterator_tag, key_type> key_start,
std::iterator<std::forward_iterator_tag, key_type> key_end);
Однако это ограничивает меня использованием итератора forward_iterator_tag
, поэтому попытка вызвать функцию, подобную этой:
remove<char, char>(std::iterator<std::random_access_iterator_tag, char>(), std::iterator<std::random_access_iterator_tag, char());
, не удастся, потому что компилятор не может преобразовать std :: iterator
в std :: iterator
. Кроме того, этот метод не работает для строковых итераторов, векторных итераторов или других итераторов stl.
Кто-нибудь знает, как stl реализует контейнеры / строки для приема итераторов друг от друга? Например, это правильно компилируется:
std::string a = "hello";
std::vector<char> v(a.begin(), a.end());