Намагаючись використовувати шаблонізовані фукції для заміни двох рядків


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 ?
Джеспер Джул

1
Нічого поганого в цьому немає. Я дізнавався про шаблоновані функції. Тому я написав цей код просто на практиці, але вихід мене заплутав. Отже, я запитав.
отриманняBetterprogrammer

Відповіді:


9

Я бачу, чому люди зараз нахмуряються на ADL ...

Те, що ви бачите, є ефектом пошуку аргументу, залежного . Якщо ви додасте друк всередині своєї swapреалізації, ви помітите, що вона не вимагається std::string, лише для int.

std::swapє кращим перед вашою версією, оскільки існує чітка спеціалізація для std::basic_stringтипу. Якби його не існувало, дзвінок був би неоднозначним.
Бо intпростір імен stdне враховується в процесі пошуку, тому ваша версія є єдино прийнятною.

Ви також можете сказати мені, як передаються рядки stl як аргументи за замовчуванням, тобто вони передаються за значенням або за посиланням?

Все в C ++ передається за значенням, якщо тільки ви не позначаєте це як прохідне посилання явно.


перевірити цей код тут: pastebin.com/E257yw04 . Моя функція swap1 () викликається для рядків, але лише один раз. Чому так?
отриманняBetterprogrammer

@dumb_programmer У вашому коді є два дзвінки, які потрібно поміняти1 (один за intі один для std::string), і так друкуються два дзвінки. Є два дзвінки swapз std::string, і вони використовують std::swap(без друку).
Yksisarvinen

Зрозумів!! Дуже дякую.
отриманняBetterprogrammer

@dumb_programmer Бічна примітка: будь ласка, не називайте себе німим. Синдром Імпостера є поширеним у цій роботі, але реальна цінність програміста - це не «скільки він знає», а «скільки він готовий вчитися». Ви чогось не зрозуміли, тому ви потягнулися і запитали - це найкраща можлива дія (після першого курсу, звичайно,).
Yksisarvinen

Так, мені щодня стає краще! Дякуємо за вашу відповідь @Yksisarvinen Я скоро зміню своє ім’я користувача.
отриманняBetterprogrammer

0

Ви передаєте параметри за значенням. Вам потрібно передати їх за посиланням:

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

Або - загальніше - за допомогою глобальної (rvalue) посилання:

template <typename T> void myswap(T&& a , T&& b);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.