functionobject 연구의 11addressof
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를 다시 불러왔는지 걱정할 필요가 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.