トップページ > 関数型プログラミング >
#include <iostream>
#include <boost/ref.hpp>
using namespace std;
void assign( int& a, int b ) { a = b; }
template<typename T> void f( T x, int val ) { assign( x, val ); }
int main()
{
int a = 10;
cout << a << endl;
// この呼び出し方ではaの値を変更できない(fのTはint型になってしまう)
f( a, 20 );
cout << a << endl;
// 参照型にキャストしてみてもやっぱりダメ(これでも値渡しになる)
f( (int&)(a), 30 );
cout << a << endl;
// こんな手はあり
f<int&>( a, 40 );
cout << a << endl;
// こんな手もあり
f( boost::ref(a), 50 );
cout << a << endl;
return 0;
}
10 10 10 40 50
関数templateに対しとして参照を渡すための補助として使うことが出来ます。
普通に渡したのでは値渡して判断されて扱われてしまうため、
上の例の様に、パラメータが参照であることを明示的に指定するか、
boost::ref
でその挙動を避けることになるわけですね。
const
オブジェクトへの参照を作る
boost::cref()
なんてものあります。