#include <boost/swap.hpp> // 配列のスワップをサポート void test1() { char a[5], b[5]; std::swap(a,b); //NG (C++11以降から可能になった) boost::swap(a,b); } // 「std::」の有無 struct basket{ void swap(basket& b){} //fast and exception-safe swap }; void swap(basket& l, basket& r) { l.swap(r); } //フリー関数 void test2() { basket c, d; std::swap(c, d);//slow using namespace std; swap(c, d);//fast boost::swap(c, d);//fast }
コンテナなどのクラスは標準のswapを使わずに自前のswap関数を使用したほうが高速で例外安全に出来る場合があります。
std::swap();と書いた場合、(フリー関数経由で)basket::swap()は使ってくれません。
swap();と書けばOKなのですがもし自前のswapが定義されなかった場合はエラーになってしまいます。その場合にはstd::swap()にフォールバックしたいわけです。そうするには事前にusing namespace std;としておけばよいのですが少々面倒です。
boost::swap()は内部で
using namespace std; swap(lhs,rhs);
としてくれていますので簡単です。
また別の利点として自前のswapメンバ関数内で2項のフリー関数のswapを呼び出そうとしてswap(lhs,rhs);と書いてもエラーになってしまいます。
struct basket{ void swap(basket& b){ using namespace std; int x, y; swap(x,y); //エラー メンバ関数版と勘違いされる boost::swap(x,y); //OK } };
boost::swap()を使っておけば頭を悩ませる必要もありません。