#include <iostream>
#include <vector>
#include <boost/ref.hpp>
template <class T> void func( T obj )
{
obj.print();
}
template <class T> T & ref(T & r) { return r; }
template <class T>
void func2( boost::reference_wrapper<T> obj )
{
obj.get().print();
}
struct A
{
A(){}
A( A const & r ){ cout << "\tコピー発生" << endl;}
void print(){ cout << "\tA::print" << endl; }
};
int main(int argc, char* argv[])
{
A a;
cout << "\nfunc( ref(a) )" << endl;
func( ref(a) ); // A& とならずにコピーが発生
cout << "\nfunc2( boost::ref(a) ) -- boost::reference_wrapper<A>" << endl;
func2( boost::ref(a) ); // コピーが発生しない
cout << "\nvector<A>::push_back" << endl;
vector<A> v;
v.push_back( a ); // コピー発生
v.begin()->print();
cout << "\nvector<boost::reference_wrapper<A> >::push_back" << endl;
vector<boost::reference_wrapper<A> > v2;
v2.push_back( boost::ref(a) ); // 参照なのでコピーが発生しない
A &a2 = *v2.begin();
a2.print();
return 0;
}