function object研究之十一 addressof
来源:互联网 发布:国家顶级域名是什么 编辑:程序博客网 时间:2024/06/05 20:27
来看看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 &.
- function object研究之十一 addressof
- function object研究之二
- function object研究之三
- function object研究之四
- function object研究之五
- function object研究之六 bind example
- function object研究之九 visit_each
- function object研究之八 add_value_*
- function object研究之七 is_placeholder
- function object研究之十 storageN
- function object研究之十二 reference_wrapper
- function object研究之十三 result_traits
- function object研究之十四 unwrap
- function object研究之十五 list1分析
- function object研究之十六 listN分析
- function object研究之十七 list_av_N
- function object研究之十八 bind_t
- function object研究之十九 bind
- apache web服务器的安装和运行
- Java 枚举7常见种用法
- struts,ognl,valuestack
- poj 1979 [ Basic DFS 填平代标记 ]
- Linux下安装RTX腾讯通
- function object研究之十一 addressof
- http://acm.nbut.cn:8081/Problem/view.xhtml?id=1317&&线段树单点查询
- C#中将图片以字符串形式存入文档中
- Android签名机制
- java 枚举学习--从小程序中学习
- 二维数组成绩处理,咋这么难叨叨
- 实习一个星期的感受
- 博客搬家
- poj-1016 C++标准库(string)的代码(优雅)体现的淋漓精致啊