Если я пишу библиотеку и у меня есть функция, которая должна возвращать последовательность значений, я мог бы сделать что-то вроде:
std::vector<int> get_sequence();
Однако это требует от пользователя библиотеки использовать контейнер std :: vector <>, а не разрешать ему использовать любой контейнер, который он хочет использовать. Кроме того, он может добавить дополнительную копию возвращаемого массива (в зависимости от того, может ли компилятор оптимизировать это или нет), что может оказать негативное влияние на производительность.
Вы можете теоретически разрешить использование произвольных контейнеров (и избежать ненужного дополнительного копирования), создав шаблонную функцию, которая принимает начало и конец:
template<class T_iter> void get_sequence(T_iter begin, T_iter end);
Функция сохранит значения последовательности в диапазоне, заданном итераторами. Но проблема в том, что вам необходимо знать размер последовательности, чтобы у вас было достаточно элементов от begin
до end
, чтобы сохранить все значения в последовательности.
Я думал об интерфейсе, таком как:
template<T_insertIter> get_sequence(T_insertIter inserter);
, который требует, чтобы T_insertIter был итератором вставки (например, созданным с помощью std::back_inserter(my_vector)
), но это кажется слишком простым для неправильного использования, так как компилятор с радостью принял бы итератор без вставки, но во время выполнения работал бы неправильно 1017 *
Итак, есть ли лучший способ разработки универсальных интерфейсов, которые возвращают последовательности произвольной длины?