【发布时间】:2014-07-18 16:56:19
【问题描述】:
我在解决程序中的问题时遇到了一些问题。所以目前每个chunk都会返回一个迭代器,但是迭代器取决于两种情况:
在块中找到所需的元素:return resultIter;
在块中未找到所需的元素:'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 函数中间突然切换返回类型,但我不知道如何解决这个问题。 注意关于代码是手头问题的一个非常简化的版本,在它的实际实现中,它位于 lambda 和更大的函数调用的一部分。然而,这是唯一相关的部分
我也试过了:
return InIter(nullptr);
return (InIter)(nullptr);
return NULL;
return InIter(NULL);
...
当然,这些都不起作用。有没有一种简单的方法可以做到这一点,我只是没有看到?
【问题讨论】:
-
AFAIK,迭代器不需要支持空值。
-
@chris 你建议我用什么来表示迭代器未能成功找到给定值?是否可以在迭代器上放置一些标志,将其标记为
null? -
std::find等 STL 算法返回范围结束迭代器以指示未找到。 -
也许默认构造的
InIter可能会起作用,或者如果您的函数采用迭代器范围,则返回结束迭代器。无论如何,错误消息所说的 lambda 在哪里?如果为 lambda 表达式指定返回类型,是否还会出现错误? -
在实现迭代器类时,通常定义最后一个状态(可能是在迭代中检查并在到达结束时设置的成员变量
bool m_is_last;,也可能是向量中的特定值vector.begin() + vector.size()。
标签: c++ templates c++11 lambda