c++ - 返回 nullptr 迭代器,如何转换它们

标签 c++ templates c++11 lambda

我在解决程序中的问题时遇到了一些问题。所以目前每个 block 都会返回一个迭代器,但是迭代器取决于两种情况:

在 block 中找到所需的元素:return resultIter; 在 block 中找到所需的元素:'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': all return expressions in a lambda must have the same type: previously it was 'test::test_iterator'

有道理,我不能在 lambda 函数中间突然切换返回类型,但我不知道如何解决这个问题。 请注意 相关代码是手头问题的一个非常简化的版本,在它的实际实现中,它位于一个 lambda 表达式中,并且是一个更大的函数调用的一部分。然而,这是唯一相关的部分

我也试过:

return InIter(nullptr);

return (InIter)(nullptr);

返回NULL;

return InIter(NULL);

...

当然这些都不起作用。有没有一种简单的方法可以做到这一点,我只是没有看到?

最佳答案

使用迭代器的预期模式是,如果您想报告您发现没有匹配项,您将返回指向序列末尾的迭代器。

所以如果你调用:

InIter res = find_an_iterator_meeting_an_interesting_condition(begin, end);

如果没有找到匹配项,您将返回 end。调用者将负责检查该条件。

关于c++ - 返回 nullptr 迭代器,如何转换它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24830227/

相关文章:

c++ AVX512 内部相当于 _mm256_broadcast_ss()?

c# - 在 WPF 中为整个应用程序设置皮肤的推荐方法是什么?

c++ - 使用 `void` 专门化模板的规则是什么?

c++在值参数中返回数据?

c++ - 如何回到C++的上一步

c++ - Visual C++无法写入exe

c++ - 可变模板函数 : argument number for each argument

c++ - 在函数中引用自动数组迭代器

c++ - 从 ‘std::exponential_distribution<double> (*)(double)’ 到 ‘std::exponential_distribution<double>*' 的参数没有已知的转换

c++ - gcc 4.7 中的错误?与否,我不确定所以我在这里问