functionobject 연구의 11addressof

1859 단어
boost::detail::addr_impl_ref 템플릿,addressof.hpp 파일에서:
template<class T> struct addr_impl_ref
{
    T & v_;

    inline addr_impl_ref( T & v ): v_( v ) {}
    inline operator T& () const { return v_; }

private:
    addr_impl_ref & operator=(const addr_impl_ref &);
};

이 템플릿은 구조 함수의 매개 변수를 내부 인용 변수에 저장하고 값 부여 작업을 금지하며 T & 형식 변환 작업을 제공합니다.다음은 사용 예입니다.
string str = "ok";
boost::detail::addr_impl_ref<string> r(str);
string & str2 = (string &)r;

다시 봐요addressof_impl 템플릿:
template<class T> struct addressof_impl
{
    static inline T * f( T & v, long )
    {
        return reinterpret_cast<T*>(
            &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
    }

    static inline T * f( T * v, int )
    {
        return v;
    }
};

이 템플릿의 구조 함수는 T&v를 매개 변수로 받아들이고 v의 지침을 되돌려줍니다.주의, 여기 이상한 reinterpret_cast의 연속적인 사용은 주로 T 형식이operator를 다시 불러오는 것을 방지하고 행위가 정의되지 않는 것을 방지하기 위해서입니다.이런 이상한 사용 방식이 이 문제를 해결하여 정말 v의 주소를 얻을 수 있다.
관련 질문의 토론 링크를 참조할 수 있습니다.http://stackoverflow.com/questions/1142607/if-an-operator-is-overloaded-for-a-c-class-how-could-i-use-a-default-operator
두 가지 기초가 있습니다. boost가 제공하는 매우 유용한addressof 템플릿을 보십시오.
template<class T> T * addressof( T & v )
{
#if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x610 ) )

    return boost::detail::addressof_impl<T>::f( v, 0 );

#else

    return boost::detail::addressof_impl<T>::f( boost::detail::addr_impl_ref<T>( v ), 0 );

#endif
}

이제 요약할 수 있는 내용은 다음과 같습니다.
boost::addressof는 T&v를 받아들이고 T 바늘을 되돌려줍니다.그리고 T가 자신의 Operator를 다시 불러왔는지 걱정할 필요가 없습니다.

좋은 웹페이지 즐겨찾기