【问题标题】:Can I store nullptr to bool?我可以将 nullptr 存储为 bool 吗?
【发布时间】:2014-02-27 10:41:26
【问题描述】:

我有一个函数,它返回一个指向给定名称的 bool 类型对象的指针。如果找不到对象,则返回nullptr

现在我想将一个变量设置为返回的布尔值,如果没有找到,则设置为 false。可以这样写吗?

bool flag = *Get("name");

这是否等同于这个更长的实现?

bool *result = Get("name");
bool flag = result == nullptr ? false : *result;

【问题讨论】:

  • 你最好用bool Get(const char* identifier, bool if_missing) 函数重载(或者get_with_default(...),如果你愿意的话),所以你可以说bool flag = Get("name", false);。许多接口都使用这种方法。
  • @TonyD 这听起来很有趣。不幸的是,get 函数实际上是像Get<T>(std::string Key) 这样模板化的,因此,对于所有类型来说,证明回退并不是那么容易。对于没有默认构造函数的类型,我不能像T *Fallback = new T()那样默认它。
  • @danijar:这仍然可以工作。考虑 C++03 中的 vector::resize 函数(它在 C++11 中更改)。它有一个使用默认构造函数的默认参数。如果该类型没有默认构造函数,则该函数仍可编译,但调用者必须提供参数。
  • @danijar: template <typename T> T Get(const char* identifier, const T& if_missing) { T* p = Get(identifier); return p ? *p : if_missing; }...不是吗?您不需要默认构造函数 - 您可以让调用者指定他们想要的后备值作为第二个 if_missing 参数(尽管有时为该参数提供默认构造的默认值会很好)。 (当我建议重载“Get”时,我想到了这一点,其中if_missing 是强制性的以确保新行为,而get_with_default 可以提供默认的第二个参数)。
  • @TonyD 这会使界面更复杂,这就是为什么我不会在这里使用这种方法。不过谢谢你告诉我这个有趣的概念。

标签: c++ pointers syntax shortcut nullptr


【解决方案1】:

第一个不正确,因为您不能取消引用空指针。

第二个是正确的,但简化为:

bool flag = result && *result;

如果您想避免每次调用都使用 result 变量,请执行以下操作:

bool istrue(bool const *result) {
    return result && *result;
}

bool flag = istrue(Get("name"));

【讨论】:

    【解决方案2】:

    不,它不等同。在第一种情况下,如果你的方法返回 nullptr,你可能会得到运行时错误。

    【讨论】:

      【解决方案3】:

      这不是等价的。在第一种情况下,您尝试取消引用 nullptr,这将崩溃,而在第二种情况下,您首先进行适当的检查。

      【讨论】:

        【解决方案4】:

        如果我理解正确,您想要的东西可以是 nullptrtruefalse

        boost 库 (www.boost.org) 有一个 optional 类,您可以利用它:

        boost::optional<bool> foo;
        

        这允许您使用if (!foo) 检查是否为空,如果相反,则使用* 恢复布尔值。

        【讨论】:

        • 在许多方面是的(减少了重量级第 3 方库的开销)。但是 boost::optional 确实允许您将 foo 本身视为一个变量。
        【解决方案5】:

        两者不等价。第一个实现将导致分段错误(因为您将尝试取消引用 NULL 指针)。

        第二种选择是正确的。

        【讨论】:

        • 啊,谢谢,我还没有看到这个。是否有另一种方法可以在不使用帮助器 result 变量的情况下完成所需的行为?
        • @danijar: 如果你不能修改Get 的接口但是你想避免result 变量那么要么调用Get 两次或者写一个函数并传递结果Get 进去。
        • @SteveJessop 我决定选择第二个选项。
        猜你喜欢
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 2012-11-29
        相关资源
        最近更新 更多