【问题标题】:Returning nullptr iterators, how to cast them返回 nullptr 迭代器,如何转换它们
【发布时间】:2014-07-18 16:56:19
【问题描述】:

我在解决程序中的问题时遇到了一些问题。所以目前每个chunk都会返回一个迭代器,但是迭代器取决于两种情况:

在块中找到所需的元素:return resultIter; 在块中找到所需的元素:'return nullptr`

第一种情况很简单也很容易解决,但第二种情况是我遇到麻烦的地方。给定模板参数InIter,如何将nullptr 转换为InIter 类别?

template< typename InIter, ...>
InInter func(...) {
  InIter res = //returns iter to found element if found
    loop(...)  //if so a token will changed to signify a cancelation
  if(token.was_cancelled())
    return res; //easy enough
  return nullptr; //doesn't work
}

这给了我这个错误:

'nullptr':lambda 中的所有返回表达式必须具有相同的类型: 以前是'test::test_iterator'

有道理,我不能在 lambda 函数中间突然切换返回类型,但我不知道如何解决这个问题。 注意关于代码是手头问题的一个非常简化的版本,在它的实际实现中,它位于 lambda 和更大的函数调用的一部分。然而,这是唯一相关的部分

我也试过了:

return InIter(nullptr);

return (InIter)(nullptr);

return NULL;

return InIter(NULL);

...

当然,这些都不起作用。有没有一种简单的方法可以做到这一点,我只是没有看到?

【问题讨论】:

  • AFAIK,迭代器不需要支持空值。
  • @chris 你建议我用什么来表示迭代器未能成功找到给定值?是否可以在迭代器上放置一些标志,将其标记为null
  • std::find 等 STL 算法返回范围结束迭代器以指示未找到。
  • 也许默认构造的InIter 可能会起作用,或者如果您的函数采用迭代器范围,则返回结束迭代器。无论如何,错误消息所说的 lambda 在哪里?如果为 lambda 表达式指定返回类型,是否还会出现错误?
  • 在实现迭代器类时,通常定义最后一个状态(可能是在迭代中检查并在到达结束时设置的成员变量bool m_is_last;,也可能是向量中的特定值vector.begin() + vector.size()

标签: c++ templates c++11 lambda


【解决方案1】:

使用迭代器的预期模式是,如果您想报告发现不匹配,您将返回指向序列末尾的迭代器。

所以如果你打电话:

InIter res = find_an_iterator_meeting_an_interesting_condition(begin, end);

如果找不到匹配项,您将返回 end。调用者将负责检查该条件。

【讨论】:

    【解决方案2】:

    有两种方法。

    首先,标准方法是,在使用迭代器时,实际上是在使用一系列迭代器(从 beginend)。

    在这种情况下,找不到内容将包括返回 end

    在一些极端的极端情况下,这不是正确的做法(想象一下,如果您问“插入 Y 的正确位置在哪里?答案不是“在序列的末尾”而是“在某处完全不同”)

    在这种情况下,像boost::optional 这样的东西是正确的答案——你的函数返回一个optional&lt;Iterator&gt;。然后你可以返回一个nullopt 来表示“没有答案是有效的”,如果答案是有效的,则返回一个迭代器。

    有人提议在 C++14 中将 optional 引入 C++。

    “穷人的可选”是std::pair&lt;bool, Iterator&gt;,如果.firstfalse,则忽略.second 的值。如果您无法访问boost,我建议您重新实现optional,而不是使用这种技术。

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 2011-06-03
      • 2014-04-18
      • 2015-04-30
      • 2017-12-12
      • 1970-01-01
      相关资源
      最近更新 更多