テンプレート化された機能を使用して2つの文字列を交換しようとしています


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に眉をひそめているのかがわかります...

表示されるのは、引数依存ルックアップの効果です。swap実装内にprintを追加すると、それがのために呼び出されるのではなく、のためstd::stringだけに呼び出されることに気付くでしょうint

std::swapそこに存在しているため、ご使用のバージョンよりも優先される明示的な特殊std::basic_stringタイプ。それが存在しなかった場合、通話はおそらくあいまいになります。
の場合int、名前空間stdはルックアッププロセスで考慮されないため、使用できるのはバージョンのみです。

また、stl文字列はデフォルトで引数としてどのように渡されるのか、つまり、値によって渡されるのか、参照によって渡されるのか教えてもらえますか?

C ++のすべては、明示的に参照渡しとしてマークしない限り、値によって渡されます。


こちらのコードを確認してください:pastebin.com/E257yw04。私の関数swap1()は文字列に対して呼び出されますが、1回だけです。何故ですか?
gettingBetterprogrammer

@dumb_programmerコードにswap1への呼び出しが2つあり(1つはとint1つstd::string)、したがって、2つの呼び出しが出力されます。swapwith への呼び出しは2つあり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.