如何检查迭代器是否是C 中的output_iterator

How to check if an iterator is an output_iterator in c++?

本文关键字:中的 output iterator 是否是 迭代器 何检查 检查      更新时间:2023-10-16
template<typename Iterator>
void put_value(Iterator pos, int n)
{
    static_assert(IsOutputIterator<Iterator>); 
    //
    // How to implement IsOutputIterator?
    //
    *pos = n;
}

std::iterator_traits<Iterator>::iterator_category无济于事。例如:vector<int>::iterator显然是output_iterator,但是std::iterator_traits<vector<int>::iterator>::iterator_category将返回random_access_iterator,这可能不是output_iterator,例如const_iterator

是否有任何可行的方法可以检查迭代器是否是C ?

中的output_iterator

我的第一个响应是问"输出迭代器?"C 输出迭代器未指定值类型,因为相同的迭代器可能能够输出多种值类型。确定是否可以通过给定迭代器o编写给定表达式E的唯一方法是查看*o = std::declval<decltype((E))>()是否是有效的表达式。

在C 14中,我会定义一个特征:

template <class...> using void_t = void;
template <class, class, class = void>
constexpr bool is_output_iterator = false;
template <class I, class E>
constexpr bool is_output_iterator<I, E, void_t<
    typename std::iterator_traits<I>::iterator_category,
    decltype(*std::declval<I>() = std::declval<E>())>> = true;

在带有概念的C 中 - 我认为您对此感兴趣,因为您用C 标记了这个问题 - 我会从GitHub中获取示例范围TS实现,然后使用其OutputIterator<I, E>()概念。