템플릿 화 된 함수를 사용하여 두 문자열을 바꾸려고 시도


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

아무 문제가 없습니다. 템플릿 기능에 대해 배우고있었습니다. 그래서 연습하기 위해이 코드를 작성했지만 출력이 혼란 스럽습니다. 그래서 물었습니다.
GettingBetterprogrammer

답변:


9

사람들이 왜 ADL에 눈살을 찌푸리는 지 알 수 있습니다

당신이 보는 것은 Argument Dependent Lookup 의 효과입니다 . 당신이 당신의 내부 인쇄를 추가하려는 경우 swap구현, 당신은이 것을 알 것 없는 요구 std::string만 들어 int.

std::swap이 생길 존재하기 때문에, 버전보다 선호되는 명시 적 전문성 에 대한 std::basic_string유형입니다. 존재하지 않으면 전화가 모호 할 것입니다.
의 경우 int네임 스페이스 std는 조회 프로세스에서 고려되지 않으므로 버전 만 사용할 수 있습니다.

또한 stl 문자열이 기본적으로 어떻게 인수로 전달되는지, 즉 값 또는 참조로 전달되는지 알 수 있습니까?

C ++의 모든 것은 명시 적으로 참조로 표시하지 않는 한 값으로 전달됩니다.


pastebin.com/E257yw04 에서이 코드를 확인하십시오 . 내 함수 swap1 ()은 문자열에 대해 호출되지만 한 번만 호출됩니다. 왜 그런 겁니까?
GettingBetterprogrammer

@dumb_programmer 코드에서 swap1에 대한 두 번의 호출 (에 대한 int하나와에 대한 하나 std::string)이 있으므로 두 개의 호출이 인쇄됩니다. swapwith 에는 두 번의 호출이 있으며 std::string사용은 std::swap(인쇄 안 됨)입니다.
Yksisarvinen

알았다!! 정말 고맙습니다.
GettingBetterprogrammer

@dumb_programmer 참고 : 바보라고 부르지 마십시오. 임 포스터 증후군은이 직업에서 일반적이지만 프로그래머의 실제 가치는 "그가 얼마나 알고 있는가"가 아니라 "배우고 자하는 것이 얼마나 많은가"입니다. 당신은 무언가를 이해하지 못했기 때문에, 당신은 손을 내밀어 물었습니다. 이것은 최선의 행동입니다 (처음 인터넷 검색 후).
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.