std:: vector в качестве аргумента функции шаблона

Я хочу сделать метод класса, который принимает ссылку std:: vector в качестве аргумента, и я хочу использовать его с различными типами данных.

функция должна выглядеть:

void some_function(const std::vector & vect){ //do something with vector }

и я хочу использовать его с например:

std::vector<int> v1;
some_function(v1);
std::vector<string> v2;
some_function(v2);

надеюсь, я ясно изложил свою точку зрения. Должен ли я сделать такой метод шаблона:

template<class T>
void some_function(std::vector<T> & vect){}

или я могу сделать это другим способом? Если я должен, пожалуйста, скажите мне, как я могу написать этот метод в класс.

Спасибо за помощь!

1 ответов


правильный путь для template функция для принятия любого std::vector by const& - это:

template<typename T, typename A>
void some_func( std::vector<T,A> const& vec ) {
}

второй аргумент - "распределитель", и в некотором расширенном использовании std::vector это не будет значение по умолчанию. Если вы просто принимаете std::vector<T> ваш some_func отвергнет std::vectors с альтернативными распределителями.

теперь есть другие способы подойти к этому, которые я перечислю быстро. Я перечислю их в уменьшении соотношения затрат и выгод - возможно, то, что указано выше вы хотите, и следующий иногда полезен, и после этого я буду разветвляться на более спроектированные случаи, которые редко заслуживают рассмотрения (но могут быть полезны в некоторых угловых случаях).

вы можете принять произвольный тип T by проверьте, если typename std::remove_reference<T>::type вид std::vector. Это позволит вам сделать "идеальную пересылку" входящего std::vector. Это также позволит вам изменить предикат, который вы используете для тестирования, чтобы принять больше, чем просто std::vector: для большая часть, const& to std::vector вероятно, просто нужен произвольный контейнер произвольного доступа.

смехотворно причудливым способом было бы сделать двухступенчатую функцию. Второй шаг принимает вид диапазона случайного доступа (или просто вид диапазона, если вам не нужен случайный доступ) для фиксированного типа T С SFINAE для обеспечения совместимости входящего объекта первый шаг выводит тип контейнера переданного типа и вызывает второй шаг в контексте SFINAE (auto some_func(...)->decltype(...)).

как тип стирания std::vector<T> const& для просмотра диапазона произвольного доступа contiguous Ts не теряет много функциональности, преимуществом было бы то, что вы могли бы гарантировать, что тело вашей функции точно такое же для std::vector<T> const& и T[n] и std::array<T,n>.

это не большое преимущество, особенно для требуемого шаблона.

c++20 может сделать это намного проще, потому что многоступенчатая SFINAE выше будет свернуть в несколько обязательных пунктов.