std::forward_iterator 的使用示例
Example of use of std::forward_iterator
我有一个 compute
函数,如下所示:
template <typename PayloadType, complex ValueType>
static void comupte_everything(
const typename std::vector<DataPointWithAverage<PayloadType, ValueType>>::iterator begin,
const typename std::vector<DataPointWithAverage<PayloadType, ValueType>>::iterator end)
我想扩展该函数,以便它可以接受任何迭代器而不仅仅是向量,我正在尝试使用 std::forward_iterator
:
template <typename PayloadType, complex ValueType,
std::forward_iterator<DataPointWithAverage<PayloadType, ValueType>> Iterator>
static void comupte_everything(
const Iterator begin,
const Iterator end)
现在,编译器抱怨我给了 forward_iterator 太多参数。
如何正确使用它?
std::forward_iterator
是一个概念,不是模板,所以不能像模板一样使用,如果要约束iterator的value_type
,那么可以
template<typename T>
constexpr bool is_DataPointWithAverage = false;
template<typename PayloadType, complex ValueType>
constexpr bool is_DataPointWithAverage<
DataPointWithAverage<PayloadType, ValueType>> = true;
template <std::forward_iterator I>
requires is_DataPointWithAverage<std::iter_value_t<I>>
static void comupte_everything(I begin, I end);
这将约束 I
必须建模 forward_iterator
,并且它的 value_type
必须是 DataPointWithAverage
.
的特化
请注意,C++20 中 range
的 begin()
和 end()
可以 return 不同的类型,因此更通用的声明应该是
template <std::forward_iterator I, std::sentinel_for<I> S>
requires is_DataPointWithAverage<std::iter_value_t<I>>
static void comupte_everything(I begin, S end);
如果您想要一种迭代特定类型范围(由模板参数定义)的算法,那么您应该提出要求。
template typename PayloadType, complex ValueType, <std::forward_iterator It, std::sentinel_for<It> Sent>
requires std::same_as<std::iter_value_t<It>, DataPointWithAverage<PayloadType, ValueType>>
static void compute_everything(It start, Sent end)
{
}
我有一个 compute
函数,如下所示:
template <typename PayloadType, complex ValueType>
static void comupte_everything(
const typename std::vector<DataPointWithAverage<PayloadType, ValueType>>::iterator begin,
const typename std::vector<DataPointWithAverage<PayloadType, ValueType>>::iterator end)
我想扩展该函数,以便它可以接受任何迭代器而不仅仅是向量,我正在尝试使用 std::forward_iterator
:
template <typename PayloadType, complex ValueType,
std::forward_iterator<DataPointWithAverage<PayloadType, ValueType>> Iterator>
static void comupte_everything(
const Iterator begin,
const Iterator end)
现在,编译器抱怨我给了 forward_iterator 太多参数。
如何正确使用它?
std::forward_iterator
是一个概念,不是模板,所以不能像模板一样使用,如果要约束iterator的value_type
,那么可以
template<typename T>
constexpr bool is_DataPointWithAverage = false;
template<typename PayloadType, complex ValueType>
constexpr bool is_DataPointWithAverage<
DataPointWithAverage<PayloadType, ValueType>> = true;
template <std::forward_iterator I>
requires is_DataPointWithAverage<std::iter_value_t<I>>
static void comupte_everything(I begin, I end);
这将约束 I
必须建模 forward_iterator
,并且它的 value_type
必须是 DataPointWithAverage
.
请注意,C++20 中 range
的 begin()
和 end()
可以 return 不同的类型,因此更通用的声明应该是
template <std::forward_iterator I, std::sentinel_for<I> S>
requires is_DataPointWithAverage<std::iter_value_t<I>>
static void comupte_everything(I begin, S end);
如果您想要一种迭代特定类型范围(由模板参数定义)的算法,那么您应该提出要求。
template typename PayloadType, complex ValueType, <std::forward_iterator It, std::sentinel_for<It> Sent>
requires std::same_as<std::iter_value_t<It>, DataPointWithAverage<PayloadType, ValueType>>
static void compute_everything(It start, Sent end)
{
}