【发布时间】:2014-10-22 16:23:04
【问题描述】:
我有一个看起来像这样的课程
struct A {
double a1;
int b1;
double a2;
int b2;
};
我必须读取a1、b1、a2 和b2 的文件值。大多数情况下,所有四个数字都在文件中,但有时只有两个数字。
当有两个数字时,我想将值存储在a1 和b1 中,并且我想在a2 和b2 中存储“无”。如果a2 和b2 是指针,我可以将它们分配为nullptr,但它们不是指针。
我可以在double 和int 变量中存储一些东西来表明“什么都没有”被存储?
我知道Boost.Optional 可用,但我试图避开那个库。
【问题讨论】:
-
选择一个你知道你的变量永远不会采用的值并将其命名为
NULL。然后将变量与NULL进行比较。首选通常是 0 或 -1 -
这就是麻烦,我不知道我的变量永远不会有的值。
-
@Josh:不,不要把它命名为
NULL。给它一个不与标准库冲突的唯一名称。 -
如果你出于某种原因真的不想使用 boost 库,为简单类型编写自己的
optional非常简单 - 只需将值和bool包装一点具有合适接口的类。如果您想支持非平凡的类型(特别是不能默认构造的类型),那么使用库将为您省去一个痛苦的世界。 -
对于浮点,您也许可以使用
NaN,但据我所知,对浮点NaN的支持并不普遍。对于int类型,INT_MIN可能 是合理的,但你说你不知道你的变量永远不会有任何值。与指针不同,整数没有明显的“nulL”值。鉴于此,您唯一的选择是存储一些额外信息,指示是否存储了有意义的值。无论您是使用Boost.Optional,还是使用类似于Boost.Optional的自己的类,还是仅添加bool成员,都取决于您。