Đang cố gắng sử dụng các phiên bản templatised để hoán đổi hai chuỗi


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

Cả hai swap()swap1()về cơ bản đều có cùng một định nghĩa hàm thì tại sao chỉ swap()thực sự hoán đổi các chuỗi, trong khi swap1()không?

Ngoài ra, bạn có thể cho tôi biết làm thế nào các chuỗi stl được truyền dưới dạng đối số theo mặc định tức là chúng được truyền theo giá trị hoặc bằng tham chiếu không?


4
Có gì sai với std :: exchange ?
Jesper Juhl

Không có gì sai với nó. Tôi đã học về các chức năng templatized. Vì vậy, tôi đã viết mã này chỉ để thực hành nhưng đầu ra làm tôi bối rối. Vì vậy, tôi đã hỏi.
getBetterprogrammer

Câu trả lời:


9

Tôi có thể thấy tại sao mọi người đang cau mày với ADL bây giờ ...

Những gì bạn thấy là một hiệu ứng của Tra cứu phụ thuộc đối số . Nếu bạn thêm một bản in bên trong swaptriển khai của mình , bạn sẽ nhận thấy rằng nó không được gọi std::string, chỉ dành cho int.

std::swapđược ưa thích hơn phiên bản của bạn, bởi vì tồn tại một chuyên môn rõ ràng cho std::basic_stringloại. Nếu nó không tồn tại, có lẽ cuộc gọi sẽ mơ hồ.
Đối với int, không gian tên không stdđược xem xét trong quá trình tra cứu, vì vậy phiên bản của bạn là duy nhất được chấp nhận.

Ngoài ra, bạn có thể cho tôi biết làm thế nào các chuỗi stl được truyền dưới dạng các đối số theo mặc định tức là chúng được truyền theo giá trị hoặc bằng tham chiếu?

Mọi thứ trong C ++ đều được truyền theo giá trị, trừ khi bạn đánh dấu nó là tham chiếu rõ ràng.


kiểm tra mã này ở đây: pastebin.com/E257yw04 . Hàm exchange1 () của tôi được gọi cho các chuỗi, nhưng chỉ một lần. Tại sao vậy?
getBetterprogrammer

@dumb_programmer Bạn có hai lệnh gọi tới exchange1 trong mã của mình (một cho intvà một cho std::string) và do đó, hai cuộc gọi được in. Có hai cuộc gọi đến swapvới std::string, và những người sử dụng std::swap(không in).
Yksisarvinen

Hiểu rồi!! Cảm ơn bạn rất nhiều.
getBetterprogrammer

@dumb_programmer Lưu ý bên: xin đừng tự gọi mình là đồ ngốc. Hội chứng kẻ mạo danh là phổ biến trong công việc này, nhưng giá trị thực sự của lập trình viên không phải là "anh ta biết bao nhiêu" mà là "anh ta sẵn sàng học bao nhiêu". Bạn đã không hiểu điều gì đó, vì vậy bạn đã tiếp cận và hỏi - đây là hành động tốt nhất có thể làm (sau khi tất nhiên là sau khi googling tất nhiên).
Yksisarvinen

Vâng, tôi đang trở nên tốt hơn mỗi ngày! Cảm ơn câu trả lời của bạn @Yksisarvinen tôi sẽ sớm thay đổi tên người dùng của mình.
getBetterprogrammer

0

Bạn đang truyền tham số theo giá trị. Bạn cần vượt qua chúng bằng cách tham khảo:

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

Hoặc - nói chung hơn - theo tham chiếu toàn cầu (giá trị):

template <typename T> void myswap(T&& a , T&& b);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.