Der Versuch, mit Vorlagen versehene Funktionen zu verwenden, um zwei Saiten zu tauschen

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

Beide swap()und swap1()haben im Grunde die gleichen Funktionsdefinitionen. Warum werden dann nur swap()die Zeichenfolgen ausgetauscht, während swap1()dies nicht der Fall ist?

Können Sie mir auch sagen, wie STL-Zeichenfolgen standardmäßig als Argumente übergeben werden, dh ob sie als Wert oder als Referenz übergeben werden?

GettingBetterprogrammer
quelle
4
Was ist los mit std :: swap ?
Jesper Juhl
Daran ist nichts auszusetzen. Ich habe etwas über Vorlagenfunktionen gelernt. Also habe ich diesen Code nur zum Üben geschrieben, aber die Ausgabe hat mich verwirrt. Also habe ich gefragt.
GettingBetterprogrammer

Antworten:

9

Ich kann sehen, warum die Leute ADL jetzt missbilligen ...

Was Sie sehen, ist ein Effekt der argumentabhängigen Suche . Wenn Sie einen Druck innerhalb Ihrer hinzufügen würden swapImplementierung, würden Sie feststellen , dass es nicht für genannt std::string, nur für int.

std::swapwird Ihrer Version vorgezogen, da es eine explizite Spezialisierung für den std::basic_stringTyp gibt. Wenn es nicht existiert, wäre der Anruf wahrscheinlich mehrdeutig.
Für int, Namespace stdist nicht im Suchprozess in Betracht gezogen, so dass Ihre Version die nur akzeptabel ist.

Können Sie mir auch sagen, wie STL-Zeichenfolgen standardmäßig als Argumente übergeben werden, dh ob sie als Wert oder als Referenz übergeben werden?

Alles in C ++ wird als Wert übergeben, es sei denn, Sie markieren es explizit als Referenzübergabe.

Yksisarvinen
quelle
Überprüfen Sie diesen Code hier: pastebin.com/E257yw04 . Meine Funktion swap1 () wird für Strings aufgerufen, aber nur einmal. Warum ist das so?
GettingBetterprogrammer
@dumb_programmer Sie haben zwei Aufrufe von swap1 in Ihrem Code (einen für intund einen für std::string), sodass zwei Aufrufe gedruckt werden. Es gibt zwei Anrufe swapmit std::stringund diese verwenden std::swap(kein Druck).
Yksisarvinen
Ich habs!! Ich danke dir sehr.
GettingBetterprogrammer
@dumb_programmer Randnotiz: Bitte nenne dich nicht dumm. Das Imposter-Syndrom ist in diesem Beruf weit verbreitet, aber der wahre Wert des Programmierers ist nicht "wie viel er weiß", sondern "wie viel er bereit ist zu lernen". Sie haben etwas nicht verstanden, also haben Sie nachgefragt - dies ist die bestmögliche Aktion (natürlich nach dem ersten Googeln).
Yksisarvinen
Ja, ich werde jeden Tag besser! Vielen Dank für Ihre Antwort @Yksisarvinen Ich werde meinen Benutzernamen bald ändern.
GettingBetterprogrammer
0

Sie übergeben Parameter nach Wert. Sie müssen sie als Referenz übergeben:

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

Oder - allgemeiner - durch globale (rWert-) Referenz:

template <typename T> void myswap(T&& a , T&& b);
Red.Wave
quelle