我在解决程序中的问题时遇到了一些麻烦。所以目前每个块都会返回一个迭代器,但迭代器依赖于两种情况:
在块中找到所需的元素: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);
...
当然,这些都不起作用。这是一个简单的方法,我只是没有看到?
答案 0 :(得分:9)
使用迭代器的预期模式是,如果要报告找到不匹配,则会返回指向序列末尾的迭代器。
所以如果你打电话:
InIter res = find_an_iterator_meeting_an_interesting_condition(begin, end);
并且找不到匹配项,您将返回end
。调用者将负责检查该情况。
答案 1 :(得分:5)
有两种方法。
首先,标准方法是,在使用迭代器时,您实际上正在使用一系列迭代器(从begin
到end
)。
在这种情况下,未能找到某些内容将包括返回end
。
在某些极端情况下,这不是正确的事情(想象一下,如果你问“在哪里插入Y的正确位置?答案不是”在序列结束时“而是”某处“完全不同的“)
在这种情况下,类似boost::optional
的内容是正确答案 - 您的函数返回optional<Iterator>
。然后你可以返回nullopt
表示“没有答案有效”,如果答案有效则返回迭代器。
有建议在C ++ 14中引入optional
到C ++。
“穷人可选”是std::pair<bool, Iterator>
,如果.second
为.first
,则忽略false
的值。如果您无法访问boost
,我建议重新实现optional
而不是使用此技术。