尝试使用模板化功能交换两个字符串


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 ::互换
Jesper Juhl,

没错。我正在学习模板化功能。所以我写了这段代码只是为了练习,但是输出使我感到困惑。
GettingBetterprogrammer,

Answers:


9

我明白了为什么人们现在不喜欢ADL ...

您看到的是参数依赖查找的效果。如果要在swap实现中添加打印,您会发现它不是 for的std::string,而只是for的int

std::swap优于你的版本,因为存在一个明确的专业化std::basic_string类型。如果不存在,则通话可能会模棱两可。
对于intstd在查找过程中不会考虑名称空间,因此您的版本是唯一可接受的版本。

还可以告诉我,默认情况下,如何将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);

或者-更一般地-通过global(rvalue)参考:

template <typename T> void myswap(T&& a , T&& b);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.