C++ 返回nullptr迭代器,如何强制转换它们
我在解决程序中的一个问题时遇到了一些问题。因此,当前每个区块将返回一个迭代器,但迭代器取决于两种情况: 在区块中找到所需的元素:C++ 返回nullptr迭代器,如何强制转换它们,c++,templates,c++11,lambda,C++,Templates,C++11,Lambda,我在解决程序中的一个问题时遇到了一些问题。因此,当前每个区块将返回一个迭代器,但迭代器取决于两种情况: 在区块中找到所需的元素:returnresultiter 所需元素在chunk:'return nullptr'中未找到` 第一种情况很简单,也很容易解决,但第二种情况就是我遇到麻烦的地方。给定一个模板参数InIter,如何将nullptr转换为InIter类别 template< typename InIter, ...> InInter func(...) { InIter
returnresultiter代码>
所需元素在chunk:'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
}
template
InInter func(…){
InIter res=//如果找到,则将iter返回到找到的元素
循环(…)//如果是这样,令牌将更改为表示取消
如果(令牌已被取消())
return res;//非常简单
return nullptr;//不起作用
}
这给了我一个错误:
“nullptr”:lambda中的所有返回表达式必须具有相同的类型:
以前它是“test::test\u迭代器”
有意义的是,我不能突然在lambda函数的中间切换返回类型,但是我不知道如何解决这个问题。请注意,关于的代码是当前问题的一个非常简化的版本,在它的实际实现中,它位于lambda内部,并且是更大的函数调用的一部分。然而,这是唯一相关的部分
我也试过:
返回InIter(nullptr)代码>
return(InIter)(nullptr)代码>
返回NULL代码>
返回InIter(NULL)代码>
…
当然这些都不管用。有一个简单的方法可以做到这一点,我只是没有看到?使用迭代器的预期模式是,如果您想报告发现不匹配,您将返回指向序列末尾的迭代器
所以如果你打电话:
InIter res = find_an_iterator_meeting_an_interesting_condition(begin, end);
如果没有找到匹配项,则返回end
。调用方将负责检查该条件。有两种方法
首先,标准方法是,在使用迭代器时,您实际上使用的是一系列迭代器(从开始
,到结束
)
在这种情况下,找不到内容将包括返回end
在某些极端情况下,这不是正确的做法(想象一下,如果你问“插入Y的正确位置在哪里?”答案不是“序列的末尾”,而是“完全不同的地方”)
在这种情况下,类似于boost::optional
的内容是正确的答案——您的函数返回一个optional
。然后您可以返回一个nullopt
,表示“没有答案是有效的”,如果答案是有效的,则返回一个迭代器
<> C++中有建议将< <代码>可选< /COD>引入C++中。
“穷人的选择”是一个std::pair
,如果.first
为false,则忽略.second
的值。如果您无法访问boost
,我建议您重新实现可选
,而不要使用此技术。AFAIK,迭代器不需要支持空值。@chris您建议我用什么来表示迭代器找不到给定值?是否可以在迭代器上放置一些标记,将其标记为某种类型的null
?STL算法,如std::find
返回范围结束迭代器以指示未找到。可能默认构造的InIter
可以工作,或者如果函数采用迭代器范围,则返回范围结束迭代器。不管怎样,错误消息中提到的lambda在哪里?如果为lambda表达式指定返回类型,是否仍会发生错误?在实现迭代器时,类通常定义最后一个状态(可能是在迭代中检查并在到达末尾时设置的成员变量bool m_is_last;
),可能是特定值vector.begin()+vector.size()
矢量格式。