Попытка использовать шаблонные функции, чтобы поменять две строки

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-строки передаются как аргументы по умолчанию, т.е. передаются ли они по значению или по ссылке?

gettingBetterprogrammer
источник
4
Что не так с std :: swap ?
Джеспер Юл
Ничего плохого в этом нет. Я узнал о шаблонизированных функциях. Поэтому я написал этот код просто для практики, но вывод меня смутил. Так что я спросил.
GettingBetterprogrammer

Ответы:

9

Теперь я понимаю, почему люди осуждают ADL ...

То, что вы видите, является эффектом Argument Dependent Lookup . Если вы хотите добавить шрифт в вашей swapреализации, вы заметите , что он не призывал std::string, только int.

std::swapпредпочтительнее вашей версии, потому что существует явная специализация для std::basic_stringтипа. Если бы этого не было, то вызов был бы неоднозначным.
Ибо intпространство имен stdне учитывается в процессе поиска, поэтому ваша версия является единственно приемлемой.

Также вы можете сказать мне, как stl-строки передаются как аргументы по умолчанию, т.е. передаются ли они по значению или по ссылке?

Все в C ++ передается по значению, если вы явно не пометите его как передачу по ссылке.

Yksisarvinen
источник
проверьте этот код здесь: pastebin.com/E257yw04 . Моя функция swap1 () вызывается для строк, но только один раз. Это почему?
GettingBetterprogrammer
@dumb_programmer У вас есть два вызова swap1 в вашем коде (один для intи один для std::string), и поэтому два вызова выводятся на печать. Есть два вызова swapс std::string, и те, которые используют std::swap(без печати).
Иксисарвинен
Понял!! Огромное спасибо.
GettingBetterprogrammer
@ dumb_programmer Примечание: пожалуйста, не называйте себя глупым. Синдром самозванца распространен в этой работе, но реальная ценность программиста не в том, «сколько он знает», а в том, «сколько он хочет учиться». Вы что-то не поняли, поэтому протянули руку и спросили - это лучшее из возможных действий (после, конечно, поиска в Google).
Иксисарвинен
Да, я поправляюсь каждый день! Спасибо за ваш ответ @ Yksisarvinen Я скоро поменяю имя пользователя.
GettingBetterprogrammer
0

Вы передаете параметры по значению. Вам нужно передать их по ссылке:

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

Или - в более общем смысле - по глобальной (rvalue) ссылке:

template <typename T> void myswap(T&& a , T&& b);
Red.Wave
источник