isSet() 或运算符 void*() 或显式运算符 bool() 或其他什么?

2024-04-05

是什么最先进的关于函数检查值是否已设置?

例如,下面的迭代器解析单元格。 某些单元格包含值,其他单元格为空。

最方便的方法是什么?

struct iterator 
{                                  //usage:
  bool isset() const               // if (it.isset()) 
  bool isSet() const               // if (it.isSet()) 
  bool empty() const               // if (it.empty()) 

  bool is_set()   const            // if (it.is_set()) 
  bool is_valid() const            // if (it.is_valid()) 

  operator void*() const;          // if (it) 

  explicit operator bool() const;  // if ((bool)it) or if(it) //thanks @stijn
  operator          bool() const;  // if (it) //why not implicit conversion?

  bool operator!() const;          // if (!!it)

  //throwing exception as pointed out by @MatthieuM
  Type get() { if (isSet()) return value_; else throw; }
  //usage:
  //     try {                    // if (it.isSet()) {
  //        Type x = it.get();    //    Type x = it.get();
  //     }                        // }
  //     catch (...) {            // else {
  //        //empty               //    //empty
  //     }                        // }

  //please feel free to propose something different
  ...
};

反思:

  1. 我的老板不明白isset()=> 重命名为isSet()
  2. empty()更多的是关于容器收集,而不仅仅是一个单元格:(
  3. operator void*似乎是合乎逻辑的方式,但是在 C++11 流中已弃用 http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool
  4. explicit operator is 尚未支持 https://stackoverflow.com/questions/11365129/explicit-operator-bool-error(我的代码必须兼容旧的编译器)

我在读:

  • http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool
  • ( http://www.artima.com/cppsource/safebool.html http://www.artima.com/cppsource/safebool.html )
  • C++11 中的 safe-bool 习惯用法是否已过时? https://stackoverflow.com/questions/6242768/is-the-safe-bool-idiom-obsolete-in-c11
  • 安全 bool 习惯用法和显式运算符 bool 之间的不兼容性 https://stackoverflow.com/questions/9383282/incompatibilities-between-safe-bool-idiom-and-explicit-operator-bool
  • boost 中的安全 bool 习语? https://stackoverflow.com/questions/11781584/safe-bool-idiom-in-boost
  • 增强源代码...

void*有问题,因为它是一个有效的转换序列,但在某些情况下并非预期的。许多人在 C++03 中使用有时称为“安全布尔习语 http://www.artima.com/cppsource/safebool.html“其中您有一个包含私有类型的本地成员函数指针类型,因此没有人可以在您的类之外拥有它的实例。但是您可以返回它并至少检查 true/false。

当你使用C++11时,那么explicit operator bool这是可行的方法,因为它主要是针对这些情况而发明的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

isSet() 或运算符 void*() 或显式运算符 bool() 或其他什么? 的相关文章

随机推荐

  • Java中有二进制文字吗?

    我想用二进制文字来声明我的整数 在Java中可以吗 在 JDK 7 中可以 int binaryInt 0b101 只需在您的号码前添加前缀即可0b
  • HornetQ 重启后不会保留消息

    我使用 HornetQ 作为队列提供程序 因为它具有持久性功能 但是 在我重新启动应用程序后 队列中的所有消息都会丢失 也许是配置问题 这是代码 Step 1 Create the Configuration and set the pro
  • Excel VBA 禁用快捷键有时会禁用数据输入

    为什么我的代码会随机偶尔禁用数据输入 但即使我隔离它并删除所有其他宏 大多数时间仍然可以工作 该代码禁用了几乎所有快捷键 但不应影响简单的数据输入 Option Explicit Rem mod ShortCutKeys Ctrl Alt
  • WebGet 的 WCF 响应格式

    WCF 为 ServiceContract 中的 WebGet 注释中的 ResponseFormat 属性提供了两个选项 ServiceContract public interface IService1 OperationContra
  • Drupal 6:打印纯正的主链接和所有子链接

    世界上怎么可能 我发誓 我读了相当于三本百科全书的书 却毫无用处 我已经尝试过区域 page tpl php 和块内的解决方案 他们都没有给我我需要的东西 而且我知道还有很多其他人也需要这个 我得出的结论是 我想打印出 page tpl p
  • 模糊除 div 之外的整个页面

    我有以下代码 除了中心的红色 div 之外 我需要将所有内容都模糊化 我尝试使用filter none or filter blur 0 但这行不通 如何模糊背景中除红色 div 之外的所有内容 编辑 我也尝试将它与 z index 一起使
  • iOS 11:蜂窝信号强度

    我正在获取蜂窝信号强度 iOS let statusBarView UIApplication shared value forKey statusBar as UIView if let foregroundView statusBarV
  • Spark:当我在 Range 中使用累加器时,它无法正常工作

    我不明白为什么 Spark 没有正确更新我的累加器 object AccumulatorsExample extends App val acc sc accumulator 0L acc sc range 0 20000 step 25
  • 在 C++17 中使用 const std::string& 参数是否有意义?

    通过得到string view在 C 17 中 我们得到了传递两者的廉价方法std string and char 不拥有字符串所有权并避免制作临时副本的函数 通过使用std string按值传递和std move我们可以显式且快速地传递右
  • 指定 NVCC 用于编译主机代码的编译器

    运行 nvcc 时 它始终使用 Visual C 编译器 cl exe 我怎样才能让它使用GCC编译器 设置CC环境变量到gcc没有修复它 我在可执行文件帮助输出中也找不到任何选项 在 Windows 上 NVCC 仅支持 Visual C
  • 为什么某些基本类型在 TypeScript 中不能传递赋值——它们是否按预期运行?

    本来想在 TypeScript 存储库的问题跟踪器中打开一个错误报告 我意识到我问了太多问题 所以我在错误报告之前在这里打开一个问题 带有相关代码的 Playground 链接 https www typescriptlang org pl
  • SecurityException - GoogleCertificatesRslt:不允许

    我们有一个拥有数百万用户的应用程序 在过去的一周里 我们从 Firebase Crashlytics 的旧版本应用程序中收到了大约 30 个 速度警报 其中包含如下错误消息 Fatal Exception java lang Securit
  • 使用按钮在打印机中打印 jLabel 的图标[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个带有图标的 jLabel 我想使用按钮在打印机 佳能 惠普 爱普生任何打印机 中打印该图标 我怎样才能做到这一点 有什么有用的代码
  • 在 MS Access 上与多个程序员一起工作

    您是否建议与多个程序员一起开发 MS Access 应用程序 我们的一款 MS Access 应用程序已经发展到了这样的程度 一名程序员无法在要求的时间范围内处理大量的更改 错误修复 和新功能 我们正在尝试使用 VBA 中未记录的 Save
  • 如何缩小自定义 Skobbler 离线地图应用程序的大小

    我正在将 Skobbler 地图集成到我的 iOS 应用程序中 目前 该应用程序的大小为 160Mb 这太大了 但我注意到已经集成了一堆地图 我想删除所有地图并让用户下载他需要的地图 现在 当我包含 SKMaps framework 时 其
  • Typescript 编译器突然开始生成错误

    我正在开发一个 Angular 2 项目 当我尝试运行打字稿编译器时 突然开始出现很多很多错误 有人可以建议从哪里开始搜索吗 我没有故意更改任何基本内容 即使当我从存储库克隆一个新副本时 错误仍然存 在 错误如下 node modules
  • Facebook SDK 3.1 - 错误:HTTP 状态代码:400

    自昨天 10 月 9 日起我已更新至 facebook SDK 3 1 后 我收到以下错误 错误 HTTP 状态代码 400 但就与 Facebook 连接而言 一切功能都完全正常 每次在我的应用程序上启动 Facebook 会话时 我都会
  • Rails 3 和图形数据库

    在 Postgresql 上运行的 Rails 3 应用程序需要切换到图形数据库才能成长 它们有很多 并且都提供不同类型的 API 主要是 REST 我深受启发talks http nosql mypopescu com post 3429
  • 如何使用 FFmpeg 在 C++ 中将 AVFrame 保存为图像

    在我的项目中 我想保存 Hevc 文件中的一帧 我在源代码中使用 FFmpeg 来解码 Hevc 文件并获取 AVFrame 和 AVCodecContext 我需要的是将框架保存为图片 全彩 我尝试将其保存为 pgm 文件 因此图片只是灰
  • isSet() 或运算符 void*() 或显式运算符 bool() 或其他什么?

    是什么最先进的关于函数检查值是否已设置 例如 下面的迭代器解析单元格 某些单元格包含值 其他单元格为空 最方便的方法是什么 struct iterator usage bool isset const if it isset bool is