std::ranges::constant_range
来自cppreference.com
在标头 <ranges> 定义
|
||
template< class T > concept constant_range = |
(1) | (C++23 起) |
Helper concepts |
||
template< class T > concept /*constant-iterator*/ = |
(2) | (C++23 起) |
2) 当输入迭代器的间接操作结果是他的常量引用(只读)时,概念 /*constant-iterator*/<T>(/*常量迭代器*/<T>,仅用于说明)成立。
Example
运行此代码
#include <ranges> #include <vector> #include <string_view> #include <span> // 确保参数是常量范围(const range,下同)的方法 // 1) 一个重载集,将可变的退化为不可变的(const) template <std::ranges::constant_range R> void takes_any_range1(R&& r) { // R 明显是常量范围 } template <std::ranges::range R> void takes_any_range1(R&& r) { takes_any_range1(std::views::as_const(std::forward<R>(r))); } // 2) 掩盖参数的函数模板 template <std::ranges::range R> void takes_any_range2(R&& _r) { auto r = std::views::as_const(std::forward<R>(_r)); // r 明显是常量范围 // 永远不要使用 _r } // 3) 函数模板递归调用自己 template <std::ranges::range R> void takes_any_range3(R&& r) { if constexpr (std::ranges::constant_range<R>) { // R 明显是常量范围 // 在这里实现函数 } else { takes_any_range3(std::views::as_const(std::forward<R>(r))); } } int main() { static_assert(not std::ranges::constant_range<std::vector<int>> and std::ranges::constant_range<const std::vector<int>> and std::ranges::constant_range<std::string_view> and not std::ranges::constant_range<std::span<int>> and not std::ranges::constant_range<const std::span<int>> and std::ranges::constant_range<std::span<const int>>); }