Tentativo di utilizzare funzioni templatised per scambiare due stringhe


9
#include<iostream>
#include<string>

template <typename T>
void swap(T a , T b)
{
  T temp = a;
  a = b;
  b = temp;
}

template <typename T1>
void swap1(T1 a , T1 b)
{
  T1 temp = a;
  a = b;
  b = temp;
}

int main()
{
  int a = 10 , b = 20;
  std::string first = "hi" , last = "Bye";

  swap(a,b);
  swap(first, last);   

  std::cout<<"a = "<<a<<" b = "<<b<<std::endl;
  std::cout<<"first = "<<first<<" last = "<<last<<std::endl;    

  int c = 50 , d = 100;
  std::string name = "abc" , surname = "def";

  swap1(c,d);
  swap1(name,surname);

  std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
  std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;    

  swap(c,d);
  swap(name,surname);

  std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
  std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;    

  return 0;
}

**Output**
a = 10 b = 20
first = Bye last = hi
c = 50 d = 100
name = abc surname = def
c = 50 d = 100
name = def surname = abc

Entrambi swap()e swap1()fondamentalmente hanno le stesse definizioni di funzione, quindi perché swap()scambiare effettivamente solo le stringhe, mentre swap1()no?

Puoi anche dirmi che come sono le stringhe stl passate come argomenti di default, cioè sono passate per valore o per riferimento?


4
Cosa c'è di sbagliato in std :: swap ?
Jesper Juhl,

Niente di sbagliato. Stavo imparando a conoscere le funzioni templatizzate. Quindi ho scritto questo codice solo per esercitarmi ma l'output mi ha confuso.
gettingBetterprogrammer

Risposte:


9

Ora capisco perché la gente aggrotta le sopracciglia su ADL ...

Quello che vedi è un effetto della Ricerca dipendente dall'argomento . Se desideri aggiungere una stampa all'interno della vostra swapapplicazione, che ci si nota che esso è non è richiesto std::string, solo per int.

std::swapè preferito rispetto alla tua versione, perché esiste una specializzazione esplicita per il std::basic_stringtipo. Se non esistesse, la chiamata sarebbe probabilmente ambigua.
Per int, lo spazio dei nomi stdnon è considerato nel processo di ricerca, quindi la tua versione è l'unica accettabile.

Puoi anche dirmi che come vengono passate le stringhe stl come argomenti per impostazione predefinita, cioè vengono passate per valore o per riferimento?

Tutto in C ++ viene passato per valore, a meno che non lo si contrassegni esplicitamente come pass-by-reference.


controlla questo codice qui: pastebin.com/E257yw04 . La mia funzione swap1 () viene chiamata per le stringhe, ma solo una volta. Perché?
gettingBetterprogrammer

@dumb_programmer Hai due chiamate da scambiare1 nel tuo codice (una per inte una per std::string), quindi vengono stampate due chiamate. Ci sono due chiamate swapcon std::stringe quelle usate std::swap(nessuna stampa).
Yksisarvinen,

Fatto!! Grazie mille.
gettingBetterprogrammer

@dumb_programmer Nota a margine: per favore, non chiamarti stupido. La sindrome di Imposter è comune in questo lavoro, ma il vero valore del programmatore non è "quanto sa" ma piuttosto "quanto è disposto a imparare". Non hai capito qualcosa, quindi hai raggiunto e chiesto: questa è la migliore azione possibile da fare (dopo aver cercato su google ovviamente).
Yksisarvinen,

Sì, sto migliorando ogni giorno! Grazie per la tua risposta @Yksisarvinen Cambierò presto il mio nome utente.
gettingBetterprogrammer

0

Stai passando parametri per valore. Devi passarli per riferimento:

template <typename T> void myswap(T& a , T& b);

Oppure - più in generale - per riferimento globale (valore):

template <typename T> void myswap(T&& a , T&& b);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.