Mencoba menggunakan fungsi templatised untuk bertukar dua string

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

Keduanya swap()dan swap1()pada dasarnya memiliki definisi fungsi yang sama lalu mengapa hanya swap()benar-benar menukar string, sementara swap1()tidak?

Dapatkah Anda memberi tahu saya bahwa bagaimana string stl diberikan sebagai argumen secara default yaitu apakah mereka dilewatkan oleh nilai atau dengan referensi?

getBetterprogrammer
sumber
4
Apa yang salah dengan std :: swap ?
Jesper Juhl
Tidak ada yang salah dengan itu. Saya belajar tentang fungsi templatized. Jadi saya menulis kode ini hanya untuk berlatih tetapi hasilnya membingungkan saya. Jadi saya bertanya.
getBetterprogrammer

Jawaban:

9

Saya bisa melihat mengapa orang-orang tidak menyukai ADL sekarang ...

Apa yang Anda lihat adalah efek dari Argument Dependent Lookup . Jika Anda akan menambahkan cetak di dalam swapimplementasi Anda, Anda akan melihat bahwa itu tidak dipanggil std::string, hanya untuk int.

std::swaplebih disukai daripada versi Anda, karena ada spesialisasi eksplisit untuk std::basic_stringjenis. Jika tidak ada, panggilan mungkin tidak jelas.
Sebab int, namespace stdtidak dipertimbangkan dalam proses pencarian, jadi versi Anda adalah satu-satunya yang dapat diterima.

Dapatkah Anda memberi tahu saya bahwa bagaimana string stl dilewatkan sebagai argumen secara default yaitu apakah mereka dilewatkan oleh nilai atau dengan referensi?

Segala sesuatu di C ++ diteruskan oleh nilai, kecuali jika Anda menandainya sebagai pass-by-reference secara eksplisit.

Yksisarvinen
sumber
lihat kode ini di sini: pastebin.com/E257yw04 . Fungsi saya swap1 () dipanggil untuk string, tetapi hanya sekali. Mengapa demikian?
getBetterprogrammer
@dumb_programmer Anda memiliki dua panggilan untuk bertukar1 dalam kode Anda (satu untuk intdan satu untuk std::string), sehingga dua panggilan dicetak. Ada dua panggilan swapdengan std::string, dan yang menggunakan std::swap(tanpa cetak).
Yksisarvinen
Oke!! Terima kasih banyak.
getBetterprogrammer
@dumb_programmer Catatan tambahan: mohon jangan menyebut diri Anda bodoh. Imposter syndrome adalah hal biasa dalam pekerjaan ini, tetapi nilai nyata programmer bukanlah "seberapa banyak yang dia tahu" melainkan "seberapa banyak dia mau belajar". Anda tidak mengerti sesuatu, jadi Anda mengulurkan tangan dan bertanya - ini adalah tindakan terbaik yang dapat dilakukan (setelah googling pertama tentu saja).
Yksisarvinen
Ya, saya semakin baik setiap hari! Terima kasih atas balasan Anda @Yksisarvinen, saya akan segera mengganti nama pengguna saya.
getBetterprogrammer
0

Anda melewati parameter berdasarkan nilai. Anda harus melewati mereka dengan referensi:

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

Atau - lebih umum - dengan referensi global (nilai):

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