我是 C++20 的新手。我一直在完善一个 C++ 概念,
IteratorLike
,旨在封装迭代器的行为。该概念检查元素访问、迭代器前进和序列末尾比较。这是概念定义:
template <typename Iter, typename ValueType, typename AccessFn, typename NextFn>
concept IteratorLike = std::invocable<AccessFn, Iter>
&& std::invocable<NextFn, Iter>
&& std::equality_comparable<Iter>
&& std::same_as<std::remove_cvref_t<std::invoke_result_t<AccessFn, Iter>>, ValueType>
&& std::same_as<std::remove_cvref_t<std::invoke_result_t<NextFn, Iter>>, Iter>;
但我不确定如何将具有指针语义的迭代器的定义应用到这个概念上,或者我对
IteratorLike
概念的定义可能存在缺陷。
如果有任何改进建议,我将不胜感激。
将 decltype 与重载运算符一起使用会导致编译错误:
static_assert(
IteratorLike<
std::vector<int>::iterator,
int,
decltype(&std::vector<int>::iterator::operator*),
decltype(&std::vector<int>::iterator::operator++)
>
);
编译器返回:“错误:‘decltype’无法解析重载函数的地址。”
我是 C++20 的新手。我一直在完善一个 C++ 概念,IteratorLike, 旨在封装迭代器的行为。
无需重新发明轮子。
<iterator>
中有相应的概念。
std::input_or_output_iterator
概念定义了类似迭代器类型的要求。
std::sentinel_for
概念定义了类似哨兵类型的要求。
std::forward_iterator
细化了input_or_output_iterator
以支持多通道并确保不同的两个可以进行比较,这对应于您概念中的equality_comparable
部分。