对 C++ 中类似指针迭代器的类似迭代器概念定义进行故障排除

问题描述 投票:0回答:1

我是 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++ iterator c++-concepts duck-typing concept
1个回答
0
投票

我是 C++20 的新手。我一直在完善一个 C++ 概念,IteratorLike, 旨在封装迭代器的行为。

无需重新发明轮子。

<iterator>
中有相应的概念。

std::input_or_output_iterator
概念定义了类似迭代器类型的要求。

std::sentinel_for
概念定义了类似哨兵类型的要求。

std::forward_iterator
细化了
input_or_output_iterator
以支持多通道并确保不同的两个可以进行比较,这对应于您概念中的
equality_comparable
部分。

© www.soinside.com 2019 - 2024. All rights reserved.