返回nullptr迭代器,如何转换它们

时间:2014-07-18 16:56:20

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

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

在块中找到所需的元素:return resultIter; 在块中找到所需元素 not :'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函数中间切换返回类型,但我不知道如何解决这个问题。 note 代码是一个非常简化的问题版本,在它的实际实现中它位于lambda内部,是一个更大的函数调用的一部分。然而,这是唯一相关的部分

我也尝试过:

return InIter(nullptr);

return (InIter)(nullptr);

return NULL;

return InIter(NULL);

...

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

2 个答案:

答案 0 :(得分:9)

使用迭代器的预期模式是,如果要报告找到不匹配,则会返回指向序列末尾的迭代器。

所以如果你打电话:

InIter res = find_an_iterator_meeting_an_interesting_condition(begin, end);

并且找不到匹配项,您将返回end。调用者将负责检查该情况。

答案 1 :(得分:5)

有两种方法。

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

在这种情况下,未能找到某些内容将包括返回end

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

在这种情况下,类似boost::optional的内容是正确答案 - 您的函数返回optional<Iterator>。然后你可以返回nullopt表示“没有答案有效”,如果答案有效则返回迭代器。

有建议在C ++ 14中引入optional到C ++。

“穷人可选”是std::pair<bool, Iterator>,如果.second.first,则忽略false的值。如果您无法访问boost,我建议重新实现optional而不是使用此技术。

相关问题