Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回nullptr迭代器,如何强制转换它们_C++_Templates_C++11_Lambda - Fatal编程技术网

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()
矢量格式。