测试C++对象的有效性,就好像它是一个指针一样
Test a C++ object validity as though it was a pointer
假设我有一个对象可能没有正确初始化,但它不仅仅是一个指向对象的空指针;它是一个成员为空或未初始化的对象。但我想以一种可读的方式检查它,就像它是一个指针一样:
if (Object) use(Object);
例如,Object可能有一个int
字段,如果为0,则认为该字段未初始化。然后,我可以做一个超负荷的!像这样的操作员:
bool operator!() const {return intField == 0;}
我可以这样使用:
if (! Object) initialize (Object);
问题是,如果我想测试相反的条件(非零),我不能只做这个:
if (Object)...
我只发现尴尬的可能性:
if (! (! Object))... // awful
if (Object.notNull()) // not so bad
最接近我愿望的是令人困惑的:
bool operator()() {return intField != 0;}
if (Object())... // it looks a lot like an argument-less constructor
AFAIK,没有布尔返回空运算符(类似于bool operator() {...}
)或任何其他技巧或习语可以实现这一点。
除了notNull()
方法之外,还有其他可读解决方案的想法吗?谢谢
您可以提供类型转换运算符,以允许转换为bool
:
explicit operator bool() const {return intField != 0;}
这允许它在布尔上下文中使用,例如if
条件。explicit
是可选的,但这是一个好主意,可以防止可能混淆的数字类型转换。
另一种方法是使用Boost.Optional或类似的方法,使任何类型都可以为null。
我认为您需要小心使用运算符重载来指示有效性或初始化状态,尤其是当您持有指向此类对象的指针或引用时。
对于这种情况,我建议使用以下显式表示法:
if (Object.isValid()) use(Object);
这样,对于下一个阅读您代码的人来说,您在这里所做的事情是显而易见的。运算符重载对使用它的人来说应该总是显而易见的,对对象进行真/假检查意味着它是否存在,而不一定是是否有效。
相关文章:
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 是否可以将前向声明和常规声明合并到一个文件中,然后像分开一样使用它?
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 模拟一个函数,该函数像操作员=和破坏者一样传播到每个字段
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- C++中是否有一个功能可以创建一个像Python的"numpy.bmat"一样简单的块矩阵?
- CAS 是一个像旋转一样的循环吗?
- 如何编写一个程序,我可以像 Ubuntu 中的命令一样添加信息(例如:程序 -u "Hello World" )
- 为什么所有核心上的sin(Vector)可以和一个核心上的sin(V)一样快
- 我需要一个像堆栈一样的数据结构,但具有随机访问,但是,我应该实现什么
- 我该怎么做 - 就像一个速度 的功率快速的功率一样快速的两个功率
- 将单个对象像一个带有一个元素的数组一样对待,采用一端指针
- 是一个 for 循环,最终甚至不会运行一次,就像调用 if 语句以首先检查大小一样快
- 如何在 C++ 中创建一个类,使其像本机 int 类一样工作
- 如何为 lambda 提供一个与 lambda 一样长的内部值
- 如何像Singleton一样使用一个类的多个对象
- C++:为什么我的hash_map会给我一个像地图一样有序的结果
- 我什么时候可以确定一个 constexpr 全局变量会像 C 宏一样被"forgotten"?