如何使用概念将模板限制为可迭代范围?

bee*_*oop 6 c++ templates function-templates c++-concepts c++20

假设我有一些模板函数,它返回传递给它的一些可迭代对象的中值。

就像是:

template<typename T>
decltype(auto) find_median_sorted(T begin)
{
  // some code here
}
Run Code Online (Sandbox Code Playgroud)

现在我想确保我T始终是可迭代的。我正在尝试学习如何concepts在 C++ 中使用,那么我可以concept在这里使用某种方法来确保T它是可迭代的吗?

我确信还有其他方法来检查它是否可迭代,但这是否是一个错误的用例concepts我还在这里发现了这篇与可迭代元素相关的文章,但我不确定这如何适用于我的情况。

JeJ*_*eJo 8

我正在尝试学习如何使用 C++ 中的概念,那么我可以concept在这里使用某种方法来确保 T 是可迭代的吗?

您可以std::ranges::range<ranges>此处的标题中获得标准概念。这样你的函数将如下所示:

#include <ranges>  // std::ranges::range

template<std::ranges::range T>
decltype(auto) find_median_sorted(T const& container) {
    // some code here
}
Run Code Online (Sandbox Code Playgroud)

要将范围限制为仅适用于随机访问可迭代范围,您可以std::ranges::random_access_range再次使用 from <ranges>header

#include <ranges>  // std::ranges::random_access_range

template<std::ranges::random_access_range T>
decltype(auto) find_median_sorted(T const& container) {
    // some code here
}
Run Code Online (Sandbox Code Playgroud)

或通过迭代器概念std::random_access_iterator 如下:

#include <iterator> // std::random_access_iterator 

template<typename  T>
decltype(auto) find_median_sorted(T const& container)
requires std::random_access_iterator<std::ranges::iterator_t<T>>
{
    // some code here
}
Run Code Online (Sandbox Code Playgroud)

  • `decltype(conatiner.begin())` 不能应用于原始数组。您应该使用“iterator_t&lt;T&gt;”。 (2认同)