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?我还在这里发现了这篇与可迭代元素相关的文章,但我不确定这如何适用于我的情况。
我正在尝试学习如何使用 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)