พยายามใช้ templatised fuctions เพื่อสลับสองสาย


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

ทั้งสองswap()และswap1()โดยพื้นฐานแล้วมีฟังก์ชั่น - นิยามที่เหมือนกันแล้วทำไมเพียงswap()แลกเปลี่ยนสตริงในขณะที่swap1()ไม่มี

คุณสามารถบอกฉันได้ว่าสตริง stl ส่งผ่านเป็นอาร์กิวเมนต์โดยค่าเริ่มต้นเช่นพวกเขาส่งผ่านตามค่าหรือโดยอ้างอิง?


4
มีอะไรผิดปกติกับstd :: swap ?
Jesper Juhl

1
ไม่มีอะไรผิดปกติกับมัน ฉันเรียนรู้เกี่ยวกับฟังก์ชั่นเทมเพลท ดังนั้นฉันจึงเขียนโค้ดนี้เพื่อฝึกฝน แต่ผลลัพธ์สับสนฉันดังนั้นฉันถาม
gettingBetterprogrammer

คำตอบ:


9

ฉันเห็นได้ว่าทำไมผู้คนถึงมีอาการขมวดคิ้วกับ ADL ตอนนี้

สิ่งที่คุณเห็นคือผลของการค้นหาขึ้นอยู่กับอาร์กิวเมนต์ หากคุณต้องการเพิ่มการพิมพ์ภายในของswapการดำเนินการที่คุณจะสังเกตเห็นว่ามันไม่ได้เรียกว่าเพียงเพื่อstd::stringint

std::swapเป็นที่ต้องการสำหรับรุ่นของคุณเนื่องจากมีความเชี่ยวชาญเฉพาะด้านสำหรับstd::basic_stringประเภท หากไม่มีอยู่การโทรก็อาจจะคลุมเครือ
สำหรับintเนมสเปซstdไม่ได้รับการพิจารณาในกระบวนการค้นหาดังนั้นเวอร์ชันของคุณจึงเป็นที่ยอมรับเท่านั้น

คุณสามารถบอกฉันได้ว่าสตริง stl ส่งผ่านโดยการโต้แย้งโดยค่าเริ่มต้นเช่นพวกเขาส่งผ่านตามค่าหรือโดยการอ้างอิง?

ทุกอย่างใน C ++ จะถูกส่งผ่านโดยค่าเว้นแต่คุณจะทำเครื่องหมายว่าเป็นแบบอ้างอิงโดยชัดแจ้ง


ตรวจสอบรหัสนี้ที่นี่: pastebin.com/E257yw04 ฟังก์ชั่นของฉัน swap1 () ถูกเรียกสำหรับสตริง แต่เพียงครั้งเดียว ทำไมถึงเป็นอย่างนั้น?
gettingBetterprogrammer

@dumb_programmer คุณมีการโทรสองครั้งเพื่อสลับ 1 ในรหัสของคุณ (หนึ่งสำหรับintและหนึ่งสำหรับstd::string) และเพื่อพิมพ์สองสาย มีการโทรสองสายswapพร้อมด้วยstd::stringและการใช้งานเหล่านั้นstd::swap(ไม่มีการพิมพ์)
Yksisarvinen

เข้าใจแล้ว !! ขอบคุณมาก.
gettingBetterprogrammer

@dumb_programmer หมายเหตุด้านข้าง: โปรดอย่าเรียกตัวเองว่าเป็นใบ้ Imposter syndrome เป็นเรื่องธรรมดาในงานนี้ แต่คุณค่าที่แท้จริงของโปรแกรมเมอร์ไม่ใช่ "เขารู้มากแค่ไหน" แต่ค่อนข้าง "เขาเต็มใจที่จะเรียนรู้มากแค่ไหน" คุณไม่เข้าใจอะไรเลยดังนั้นจึงยื่นมือออกไปถามว่า - นี่เป็นการกระทำที่ดีที่สุดที่จะทำ (หลังจาก googling ก่อนแน่นอน)
Yksisarvinen

ใช่ฉันดีขึ้นทุกวัน! ขอบคุณสำหรับการตอบกลับของคุณ @Yksisarvinen ฉันจะเปลี่ยนชื่อผู้ใช้ของฉันในไม่ช้า
gettingBetterprogrammer

0

คุณกำลังส่งพารามิเตอร์ตามค่า คุณต้องผ่านพวกเขาโดยอ้างอิง:

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

หรือ - โดยทั่วไป - ตามการอ้างอิงทั่วโลก (rvalue):

template <typename T> void myswap(T&& a , T&& b);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.