boost::swap

トップページ > 小道具 >

abstract

必要なヘッダ
<boost/swap.hpp>
出来ること
値の交換
リファレンス
en

sample

サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]

#include <iostream>
#include <string>
#include <boost/swap.hpp>

int main()
{
	int x=100, y=200;
	boost::swap(x, y);
	std::cout << x << " " << y << std::endl;

	std::string s="foo", t="bar";
	boost::swap(s, t);
	std::cout << s << " " << t << std::endl;

	int a[]={1,2,3}, b[]={4,5,6};
	boost::swap(a, b);
	std::cout << a[1] << " " << b[1] << std::endl;
}

出力結果

200 100
bar foo
5 2

etc

標準ライブラリにも std::swap という汎用スワップ関数は用意されているのですが、 そちらは汎用過ぎて、例外安全の保証が弱かったり、効率が悪かったりします。 なので、スワップ対象の型の側でswap関数が用意されていたらそちらを使った方が良いのですが…… 汎用コードの中で「専用swapが用意されていれば使う、用意されていなければstd::swap」という処理を書こうと思うと、

{
	...
	using namespace std;
	swap(x, y);
	...
}

といった、using namespace を使う技が必要になってきます。 この2行をラップして一つの関数にしたのが、要するに、boost::swap。それだけです。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0