Ad immutable: Вы можете использовать конструктор диапазона вектора и создать входной итератор для предоставления содержимого для вектора. Конструктор диапазона просто:
template <typename I>
A::A(I const &begin, I const &end) : vec_(begin, end) {}
Генератор немного сложнее. Если у вас теперь есть цикл, который создает вектор с использованием push_back, потребуется немало переписать для преобразования в объект, который возвращает один элемент за раз из метода. Чем вам нужно обернуть ссылку на него в допустимом итераторе ввода.
Функции без рекламы: Из-за перегрузки загрязнение пространства имен обычно не является проблемой, поскольку символ будет рассматриваться только для вызова с определенным типом аргумента.
Также свободные функции используют поиск, зависящий от аргумента. Это означает, что функция должна быть помещена в пространство имен, в котором находится класс. Например:
#include <vector>
namespace std {
int hash(vector<int> const &vec) { /*...*/ }
}
//...
std::vector<int> v;
//...
hash(v);
Теперь вы все равно можете назвать hash
неквалифицированным, но не видите его для каких-либо других целей, если вы не сделаете using namespace std
(лично я почти никогда не делаю этого и просто использую префикс std::
или делаю using std::vector
чтобы получить только символ, который я хочу). К сожалению, я не уверен, как поиск, зависящий от пространства имен, работает с typedef
в другом пространстве имен.
Во многих шаблонных алгоритмах вместо методов часто используются свободные функции - и с довольно общими именами - потому что они могут быть добавлены к существующим классам, могут быть определены для примитивных типов или для обоих.