std::ranges::constant_range
来自cppreference.com
在标头 <ranges> 定义
|
||
template< class T > concept constant_range = |
(1) | (C++23 起) |
辅助概念 |
||
template< class T > concept /*constant-iterator*/ = |
(2) | (C++23 起) |
2) 当输入迭代器的间接操作结果是其常引用(隐含只读)时,仅用于阐释的概念 /*constant-iterator*/<T> 得到满足。
示例
运行此代码
#include <ranges> #include <vector> #include <string_view> #include <span> // 确保参数为常范围的机制 // 1) 重载集,其中可变版本委托给常量版本 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>>); }