boost reference_wrapper

1414 ワード

reference_wrapperはリファレンスタイプのパッケージです

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