Syn*_*ose 4 c++ lambda templates c++11
我在解决程序中的问题时遇到了一些麻烦.所以目前每个块都会返回一个迭代器,但迭代器依赖于两种情况:
所需的元件被在块中找到:return resultIter;
所需的元件未在块中找到:"返回nullptr`
第一种情况很简单,很容易解决,但第二种情况是我遇到麻烦的地方.给定模板参数InIter,如何将a 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
}
Run Code Online (Sandbox Code Playgroud)
这给了我这个错误:
'nullptr':lambda中的所有返回表达式必须具有相同的类型:以前是'test :: test_iterator'
它是有道理的,我不能突然在lambda函数中间切换返回类型,但我不知道如何解决这个问题.请注意,代码是一个非常简化的问题版本,在它的实际实现中它位于lambda内部,是一个更大的函数调用的一部分.然而,这是唯一相关的部分
我也尝试过:
return InIter(nullptr);
return (InIter)(nullptr);
return NULL;
return InIter(NULL);
...
当然,这些都不起作用.这是一个简单的方法,我只是没有看到?
使用迭代器的预期模式是,如果要报告找不到匹配项,则返回指向序列末尾的迭代器.
所以,如果你打电话:
InIter res = find_an_iterator_meeting_an_interesting_condition(begin, end);
Run Code Online (Sandbox Code Playgroud)
它找不到匹配,你会回来end.调用者将负责检查该条件.
有两种方法.
首先,标准方法是,在使用迭代器时,您实际上正在使用一系列迭代器(从a begin到a end).
在这种情况下,找不到东西将包括返回end.
在一些极端的情况下,这不是正确的事情(想象一下,如果你问"在哪里插入Y的正确位置?答案不是"在序列的末尾"而是"某处完全不同" )
在这种情况下,类似的boost::optional是正确的答案 - 你的函数返回一个optional<Iterator>.然后你可以返回一个nullopt意思是"没有答案是有效的",如果答案是有效的,则返回一个迭代器.
有建议在optionalC++中引入C++ 14.
"穷人的可选"是std::pair<bool, Iterator>,你忽略.second的值,如果.first是false.如果您无法访问boost,我建议重新实现optional而不是使用此技术.
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |