Tentando usar funções de modelo para trocar duas strings

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

Ambos swap()e swap1()basicamente têm as mesmas definições de funções, por que apenas swap()trocam as strings, enquanto swap1()não?

Além disso, você pode me dizer que como as strings stl são passadas como argumentos por padrão, ou seja, são passadas por valor ou por referência?

gettingBetterprogrammer
fonte
4
O que há de errado com std :: swap ?
Jesper Juhl 20/04
Nada de errado com isso. Eu estava aprendendo sobre funções modeladas. Então eu escrevi esse código apenas para praticar, mas a saída me confundiu.
gettingBetterprogrammer

Respostas:

9

Eu posso ver por que as pessoas estão desaprovando a ADL agora ...

O que você vê é um efeito da pesquisa dependente de argumento . Se você adicionar uma impressão em sua swapimplementação, perceberá que ela não é solicitada std::string, apenas para int.

std::swapé preferível à sua versão, porque existe uma especialização explícita para o std::basic_stringtipo. Se não existisse, a ligação seria ambígua provavelmente.
Pois int, o espaço para nome stdnão é considerado no processo de pesquisa; portanto, sua versão é a única aceitável.

Além disso, você pode me dizer que como as strings stl são passadas como argumentos por padrão, ou seja, são passadas por valor ou por referência?

Tudo em C ++ é passado por valor, a menos que você o marque como referência explicitamente.

Yksisarvinen
fonte
confira este código aqui: pastebin.com/E257yw04 . Minha função swap1 () é chamada para strings, mas apenas uma vez. Por que é que?
gettingBetterprogrammer
@dumb_programmer Você tem duas chamadas para trocar1 no seu código (uma para inte uma para std::string) e, portanto, duas chamadas são impressas. Existem duas chamadas para swapcom std::stringe essas são usadas std::swap(sem impressão).
Yksisarvinen 20/04
Entendi!! Muito obrigado.
gettingBetterprogrammer
@dumb_programmer Nota lateral: por favor, não se chame de idiota. A síndrome do impostor é comum neste trabalho, mas o valor real do programador não é "o quanto ele sabe", mas "o quanto ele está disposto a aprender". Você não entendeu alguma coisa, então entrou em contato e perguntou - esta é a melhor ação possível (depois de pesquisar no Google, é claro).
Yksisarvinen 20/04
Sim, estou melhorando todos os dias! Obrigado pela sua resposta @Yksisarvinen Em breve, mudarei meu nome de usuário.
gettingBetterprogrammer
0

Você está passando parâmetros por valor. Você precisa passá-los por referência:

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

Ou - mais geralmente - por referência global (rvalue):

template <typename T> void myswap(T&& a , T&& b);
Red.Wave
fonte