unspecified-bool-type

unspecified_bool_type 手法 在 C++ 中,有时候我们需要一个自定义类型能够支持 if(obj) 和 if(!obj) 之类的语法,也就是说MyClass obj;if(obj){ //do something}if(!obj){ //do something}这个需要在智能指针的实现中尤其明显,因为它可以保证与原生 C++ 指针在用法上的一致性。明显的解决方法是重载 operator bool() 转换,但是这样问题太多,... 阅读详情

类boost::scoped_ptr的源码中有如下声明:

operator unspecified-bool-type() const;
    这是个到unspecified-bool-type类型的隐式转换函数,它可以在Boolean上下文中测试一个智能指针。如果shared_ptr保存着一个有效的指针,返回值为True;否则为false。注意,转换函数返回的类型是不确定的。把返回类型当成bool用会导致一些荒谬的操作,所以典型的实现采用了safe bool idiom,它很好地确保了只有可适用的Boolean测试可以使用。这个函数不会抛出异常。


safe bool idiom

这个就是传说中的布尔类型转换操作符号:
当我们使用if(p) 这个来检测一个p(可以是一个变量也可以是一个自己定义的类型),如果是变量很简单,如果是类型就要使用到类型的BOOL 类型转换操作符号了
safe bool idiom的起源来自于这样子的一种用法:if( obj ) { ... },对于obj是built-in类型,那自然行得通,但是对于一个class或者struct就并不总是可以了。当然可以通过这样子的用法来代替:if( obj.is_valid() ){},问题很明显,第一烦琐,第二通用性不够,也许应该使用obj.Valid()或者obj.Empty()之类的,这与template结合起来考虑是尤其是个问题。因此我们希望有一个解决方案是的我们直接可以写下if(obj)这样的语句。
初初一想,这很简单,重载operator bool不就可以了,又或者重载operator void*?是的,这两个方法确确实实使得我们可以使用if(obj)这样的语句了,但是仔细推敲的话就会发现有很多问题。
再看一个问题:
第一次看到while(cin)这种循环条件,把他改成了while(1)效果也是一样,那到底两个有什么区别呢?
while后面都是对循环的条件的检测,cin不是bool,cin是个istream类型的对象,而istream重载了operator   void*(),指针类型是可以进行判断的,0指针为false,非0为true。
至于为什么用void*而不用bool,是bool几乎可以隐式转成其它各种类型,因此容易引发各种让人奇怪的转换甚至隐藏程序错误,比如转换成char:
char   c   =   cin;
再比如:
putchar(cin);
这看上去太奇特了,所以operator   bool()不好,改用operator   void*()了。

看这里:http://www.artima.com/cppsource/safeboolP.html


参考:

http://blog.csdn.net/hityct1/article/details/3923074

http://www.cnblogs.com/hujian/archive/2012/12/10/2810754.html





解读boost库的unspecified_bool_type 原文链接解读boost库的unspecified_bool_type_zhenyonghou的博客-CSDN博客 在boost的智能指针(包括scoped_ptr,scoped_array,shared_ptr,shared_array)里,会看到每个类都有一个成员函数(就称其为函数吧)operator unspecified_bool_type() const,而且是public的,如果你看过源码,也许会产生如何使用的困惑,下面贴出源码。 typedef T * this_type::*unsp.. 阅读详情

相关推荐

Boost库高效内存管理——smart_ptr库——scoped_ptr/scoped_array

Boost库有着”C++’准’标准库”之称,内容涵盖字符串处理,正则表达式,容器与数据结构,并发编程,函数式编程,泛型编程,设计模式实现等许多领域,这一篇学习Boost高效的内存管理方法 之前学习过C++11中的智能指针auto_ptr/shared_ptr/unique_ptr ,读者可以回顾一下。实质上,C++新标准的TR1库收录了Boost库中的shared_ptr和weak_ptr 智能

哒哒的博客 845

解读boost库中的unspecified_bool_type

刚接触boost库不久,看到unspecified_bool_type的定义脑袋十分之晕~摘出其中的实现(scoped_ptr.hpp)    typedef T * this_type::*unspecified_bool_type;    operator unspecified_bool_type() const // never throws    ...{        re

2584

智能指针

1 namespace smart 2 { 3 // 引用计数类. 4 class smart_count 5 { 6 public: 7 smart_count(int c = 0) : use_count(c) {} 8 ~smart_count() {} 9 10 // 增加

和大黄的博客 1446

Boost,scoped_ptr中的unspecified_bool_type

从官网上下的boosthttp://sourceforge.net/projects/boost/files/boost/1.48.0/已经在硬盘里扔了半个月了,一直也没时间碰.终于抽出来点空,从scoped_ptr看起来吧.毕竟智能指针相对熟练一点.scoped_ptr应该是属于最简单,安全的非侵入式智能指针了.auto_ptr赋值与拷贝构造会交出指针的控制权,这个行为真是令人头大,不仅不符合常

yuezhiren的专栏 1460

osg源码中的ref_ptr operator unspecified_bool_type() 指向类数据成员的指针&类转化为另一类型(如自定义的C类转化为int)

templateclass A{public: typedef T A::*unspecified_bool_type;//另一类型,指向T的指针,但该类型是属于A的,声明时要加A::,访问时应加a..   operator unspecified_bool_type() const  {   m_p= 3;  return &A::m_p;//一定要用A:: }public: T m_p;};A a;A::unspecified_bool_type m= a;//或者A::unspecified_bool

tmljs1988的专栏 1367

prototext format 随机空格

golang 语言,使用 prototext 进行 format 的时候,相同代码输出不唯一。

蜂蜜味的哈士奇 493

Protobuf 枚举设计规范:3 个最佳实践与 2 个版本兼容性案例

本文详细介绍了Protobuf枚举设计的3个最佳实践与2个版本兼容性案例,包括必须声明零值作为默认项、枚举项的命名与值分配规范以及作用域与复用策略。通过实际案例展示了如何安全添加新枚举值和弃用与删除枚举值,确保系统扩展性和兼容性。

HJ921004的博客 429

C++开发者必读:Protocol Buffer 3.0核心原理与高性能实战指南

数据序列化是网络通信、数据持久化和微服务架构中的核心技术,它定义了结构化数据的编码与解码规则,直接影响系统性能和可维护性。其核心原理在于通过预定义的数据契约(Schema),实现跨语言、跨平台的高效二进制编码,相比XML和JSON等文本格式,在传输效率和解析速度上具有显著优势。这一技术价值在于为大型分布式系统提供了紧凑的数据表示、卓越的性能和强大的版本兼容性,广泛应用于RPC框架、配置文件存储和数据库通信等场景。本文聚焦于Protocol Buffer 3.0,深入解析其C++ API设计、内存管理优化(如

weixin_30384217的博客 388
上一篇: fill和fill_n函数的应用 / fill_n与generate_n的区别
下一篇: 桥接模式与策略模式
华秋实
博客等级 码龄19年 340粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值