0

我在 Android 上使用 NDK,我希望得到类似于 Java 上的 List 的东西,其中元素可以是空值。我知道在 C++ 中 null 与 Java 不同,所以我在寻找元素的值是可选的。

我知道 Boost 有Boost.Optional,我不想为此添加这个库。我return Nullable<double>();在 stackoverflow 上 看到过这样的代码How to use Nullable types in c++/cli? 但我认为这仅适用于 MS Visual C++,当我编写类似的代码时,它说 Nullable 无法解决。

我正在使用 STLPort 库。

4

2 回答 2

0

使用空对象模式或在列表中存储(智能)指针。

于 2013-03-29T20:54:08.320 回答
0

int这是我们正在谈论的32位。您的变量的性质是什么 - 您确定所有 4294967296 个可能的值都同样可能和有效吗?在绝大多数情况下,您可以将特定的 int 值(零、-1 或十亿)指定为“非值”,并像对待 null 一样对待它。仔细考虑您的列表,看看您是否可以选择一个不可能出现在列表中的值,如果有,则将其视为空值。

我能想到的所有可能的 int 值都同样有效的唯一用例是 32 位散列或校验和(如 CRC32)。

所有其他方法都失败了,旋转您自己的可为空原语的实现相当容易。基本情况如下:

template<typename T>
class Nullable<T>
{
    T _Value;
    bool _IsNull;
public:

    Nullable<T>();
    Nullable<T>(T);
    Nullable<T>(Nullable<T> &);
    Nullable<T> &operator=(Nullable<T> &);
    Nullable<T> &operator=(T);

    operator T(); //Value extractor
    bool IsNull(); //Nullity extractor
};

And so forth. You won't need a destructor. You can even throw an exception if they're trying to extract the value from a null object.

于 2013-03-29T22:19:30.810 回答