0
votes

Comment faire un paramètre de vecteur avec un type non spécifique?

Je vis de créer une fonction C ++ qui prend un paramètre vecteur et, indépendant sur le type indiqué au vecteur, imprimez le contenu du vecteur sur un, à côté de l'autre. Le code ci-dessous fonctionne pour les vecteurs de type : xxx

Quel changement dois-je faire pour le faire fonctionner avec n'importe quel type de vecteur? < / p>


0 commentaires

3 Réponses :


7
votes

simple: faites-en une fonction de modèle. Aussi, vous devriez passer le vecteur de (const) Référence pour éviter des copies inutiles.

template<typename T, typename Allocator>
void PrintVect(const std::vector<T, Allocator> &vect)
{
    for (const auto &i : vect) std::cout << i;
}


2 commentaires

Cela suppose bien sûr qu'il existe un opérateur approprié << () surcharge pour diffuser un t à un std :: ostream . Pour les types fondamentaux ( INT , etc.) et des types - Tous types de la bibliothèque standard, cette hypothèse est vraie. Pour les types pour lesquels il n'est pas vrai, une telle solution ne compilera pas. Il n'a pas de sens de pouvoir diffuser tous les types afin qu'il soit nécessaire de mettre en œuvre délibérément une capacité de diffusion en continu lorsqu'il est nécessaire.


@Peter j'ai senti que c'était impliqué par le mot "print"



2
votes

vecteur et vecteurs avec type d'élément différent, par ex. vecteur , avoir des types différents et ne partageez pas un "superype" commun, que vous pourriez passer à votre "imprimer toute sorte de fonction de vecteurs".

Vous pouvez cependant définir un Fonction de modèle qui prend le type d'élément du vecteur comme paramètre de modèle; Par cela, le compilateur générera automatiquement une fonction d'impression dédiée pour chaque type d'élément que vous utilisez réellement: xxx

notez le const et le & dans void printVect (const vecteur & vect) ; Comme le vecteur n'est pas modifié, le passage d'une copie du vecteur serait superflu; Donc, le type de paramètre doit être une référence Const, c'est-à-dire const & .


0 commentaires

2
votes

Vous pouvez créer une fonction de modèle qui créera en effet une copie de la fonction pour chaque vecteur code> que vous utilisez.

#include <iostream>
#include <vector>

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vect) {
    for(const auto& val : vect)
        os << val;
    return os;
}

int main() {
    std::vector<int> nums = {1, 2, 3};

    std::cout << nums << "\n";
}


0 commentaires