Я пытаюсь реализовать функцию, которая позволяет пользователю вводить некоторый тип начального и конечного итератора, а затем все выполняют некоторую операцию с данными.Однако эта функция должна быть достаточно общей и работать для многих типов итераторов (например, 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::random_access_iterator_tag,...>
в std::iterator<std::forward_access_iterator_tag,...>
.Кроме того, этот метод не работает для строковых итераторов, векторных итераторов или других итераторов stl.
Кто-нибудь знает, как stl реализует контейнеры / строки для приема итераторов друг от друга?Например, это правильно компилируется:
std::string a = "hello";
std::vector<char> v(a.begin(), a.end());