std::vector come modello argomento della funzione

Voglio fare un metodo di una classe che prende un std::vector di riferimento come argomento e voglio utilizzarlo con diversi tipi di dati.

La funzione dovrebbe assomigliare a questo:

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

e voglio usarlo con per esempio:

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

Spero che ho fatto il mio punto chiaro.
Devo fare un modello di metodo simile a questo:

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

o posso farlo in altro modo? Se devo, per favore mi dica come posso scrivere che un metodo in una classe.

Grazie per l’aiuto!

  • Sì, questo è il modo per farlo. O stai chiedendo qualcosa di altro?
  • Cosa c’è di sbagliato con te suggerito?
  • La risposta a questa domanda è di per sé sufficiente. Solo per aggiungere che se qualcuno desidera scorrere tali vettori, quindi, utilizzare : for(typename vector<T, A>::const_iterator it = vect.begin(); it != vect.end(); ++it)
InformationsquelleAutor Preetygeek | 2013-09-30

 

One Reply
  1. 31

    Il modo giusto per un template funzione ad accettare qualsiasi std::vector da const& è:

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

    il secondo argomento è il “allocatore”, e in alcuni di utilizzo avanzato di std::vector non essere quello di default. Se devi solo accettare std::vector<T>, il some_func rifiuterà std::vectors alternativi allocators.

    Ora, ci sono altri modi per avvicinarsi a questo che io vi elenco rapidamente. Io li elenco in calo del costo:il rapporto benefici-quella sopra è probabilmente ciò che si vuole, e la successiva è a volte utile, e dopo di che mi si diramano in eccedenza costruita casi che sono raramente vale la pena considerare (ma potrebbe essere utile in alcuni casi particolari).

    Si potrebbe accettare un tipo arbitrario T da T&& quindi verificare se typename std::remove_reference<T>::type è una sorta di std::vector. Questo le permetterebbe di fare “perfetto forwarding” incoming std::vector. Sarebbe, inoltre, permette di cambiare il predicato si utilizza per eseguire il test per accettare più di un std::vector: per la maggior parte, const& per std::vector probabilmente solo bisogno di un po arbitrario ad accesso casuale contenitore.

    Un ridicolo modo di fantasia, sarebbe quello di fare due passaggi di funzione. Il secondo passo richiede un tipo cancellati ad accesso casuale gamma vista (o solo un intervallo di vista se non avete bisogno di accesso casuale) per un determinato tipo di T con SFINAE per garantire che l’arrivo di un oggetto è compatibile, il primo passo deduce il tipo di contenitore della passata tipo e chiama il secondo passo di un SFINAE contesto (auto some_func(...)->decltype(...)).

    Tipo cancellazione di std::vector<T> const& per un accesso casuale gamma vista contigui Ts non perde molto di funzionalità, un vantaggio potrebbe essere che è in grado di garantire che il corpo della funzione è esattamente la stessa per std::vector<T> const& e per T[n] e per std::array<T,n>.

    Non è un grande vantaggio, soprattutto per gli standard richiesti.

    possono fare questo molto più facile, perché il multi-step SFINAE sopra crollare in pochi richiede clausole.

Lascia un commento