boost reference_wrapper
reference_wrapperはリファレンスタイプのパッケージです
reference_wrapperは、パッケージングされたオブジェクトの別名のようなものですが、Tを使用する文脈でのみ暗黙的な変換を実行できます.他の場合、タイプ変換関数またはget()関数を呼び出してこそ、本当にパッケージングされるオブジェクトが必要になります.
template<class T> class reference_wrapper
{
public:
typedef T type;
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 )
explicit reference_wrapper(T& t): t_(&t) {}
#else
explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
#endif
operator T& () const { return *t_; }
T& get() const { return *t_; }
T* get_pointer() const { return t_; }
private:
T* t_;
};
reference_wrapperは、パッケージングされたオブジェクトの別名のようなものですが、Tを使用する文脈でのみ暗黙的な変換を実行できます.他の場合、タイプ変換関数またはget()関数を呼び出してこそ、本当にパッケージングされるオブジェクトが必要になります.
#include<boost/ref.hpp>
#include<assert.h>
#include<iostream>
using namespace std;
using namespace boost;
int main()
{
int x=10;
reference_wrapper<int> rw(x);
assert(x==rw);
(int &)rw=100;
reference_wrapper<int> rw2(rw);
assert(rw2.get()==100);
cout << rw2.get() << endl;
string str;
reference_wrapper<string> rws(str);
*rws.get_pointer() = "test reference_wrapper";
cout << rws.get().size() << endl;
}
100
22