Я хочу поместить объекты в контейнер (какой контейнер не фиксирован).
Для этого я хочу использовать концепцию std::output_iterator
.
Как мне определить функцию, которая принимает, например, std::insert_iterator<std::vector<T>>
и std::insert_iterator<std::list<T>>
?
концепция std::output_iterator
принимает два аргумента шаблона: I
и T
. Поэтому я не уверен, как бы я объявил такую функцию.
Я мог бы сделать это как в старой школе <algorithm>
и объявить это так:
template<typename OutIter>
void foo(OutIter writer);
но это не так выразительно имхо.
ОБНОВЛЕНИЕ: вот моя попытка, основанная на ответе @RemyLebeau:
#include <iterator>
#include <vector>
template<typename I, typename T, std::output_iterator<I,T> OutIter>
void foo(OutIter writer) {
writer++ = T();
}
int main() {
std::vector<int> ints;
auto inserter = std::insert_iterator(ints,ints.end());
foo(inserter);
}
это примеры... как написано в моем вопросе.
хм? std::output_iterator
— это КОНЦЕПЦИЯ. Я хочу написать шаблонную функцию, которая ограничивает функцию приемом итераторов вывода. Я просто понятия не имею, как объявить это с концепцией.
У @Remy Lebeau есть правильная идея, но не правильное исполнение. Первый аргумент шаблона концепции — это ограничиваемый тип, и его не нужно указывать при использовании для ограничения другого аргумента шаблона.
Их ответ с правильным кодом:
#include <iterator>
#include <vector>
template<typename T, std::output_iterator<T> OutIter> // note: no template argument I required
void foo(OutIter writer) {
writer++ = T();
}
int main() {
std::vector<int> ints;
auto inserter = std::insert_iterator(ints,ints.end());
foo<int>(inserter); // note you have to specify int when calling foo
return 0;
}
Это не совсем ваш вариант использования, так как вы не хотите указывать тип итератора foo при вызове функции. Но используя концепцию output_iterator, foo может указать сам тип итератора:
#include <iterator>
#include <vector>
template<std::output_iterator<int> OutIter> // Explicitly requests an iterator that ints can be written to
void foo(OutIter writer) {
writer++ = int{};
}
int main() {
std::vector<int> ints;
auto inserter = std::insert_iterator(ints,ints.end());
foo(inserter);
return 0;
}
я не знал, что вы можете указать тип во вложенном шаблоне. Большое спасибо!
что не имеет смысла? Мне нужна функция, которая принимает
input_iterator<vector<T>>
,input_iterator<list<T>>
. обаoutput_iterator
. Я просто понятия не имею, как это объявить.