【问题标题】:How to check if an iterator is an output_iterator in c++?如何检查迭代器是否是 c++ 中的 output_iterator?
【发布时间】:2016-12-01 01:29:13
【问题描述】:
template<typename Iterator>
void put_value(Iterator pos, int n)
{
    static_assert(IsOutputIterator<Iterator>); 
    //
    // How to implement IsOutputIterator?
    //

    *pos = n;
}

std::iterator_traits&lt;Iterator&gt;::iterator_category 没有帮助。例如:vector&lt;int&gt;::iterator 显然是output_iterator,但std::iterator_traits&lt;vector&lt;int&gt;::iterator&gt;::iterator_category 将返回random_access_iterator,它可能不是output_iterator,比如const_iterator

是否有任何可行的方法来检查迭代器是否是 c++ 中的 output_iterator?

【问题讨论】:

  • 输入迭代器类别以外的任何迭代器都是输出迭代器。
  • 随机访问迭代器满足输出迭代器的所有要求。
  • 不,输出迭代器可能不允许读取。你只能写它。
  • 满足Output Iterator 页面上列出的所有要求。
  • @Eugene,const_iterator 是 output_iterator 吗?

标签: c++ iterator c++-concepts


【解决方案1】:

我的第一反应是问“输出迭代器是为了什么?” C++ 输出迭代器不指定值类型,因为同一个迭代器可能能够输出多个值类型。确定是否可以通过给定迭代器 o 编写给定表达式 E 的唯一方法是查看 *o = std::declval&lt;decltype((E))&gt;() 是否为有效表达式。

在 C++14 中,I'd define a trait to do so:

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++ 中——我假设你对这个问题感兴趣,因为你用 标记了这个问题——我会抓住 sample Ranges TS implementation from github 并改用它的 OutputIterator&lt;I, E&gt;() 概念。

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2012-08-15
    • 2011-01-04
    • 2011-03-02
    • 2011-10-20
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多