最終更新日時(UTC):
が更新

履歴 編集

concept
<iterator>

std::input_or_output_iterator(C++20)

namespace std {
  template<class I>
  concept input_or_output_iterator =
    requires(I i) {
      { *i } -> can-reference;
    } &&
    weakly_incrementable<I>;
}

概要

input_or_output_iteratorは、イテレータ型Iweakly_incrementableであり、間接参照が何らかの結果を返すことを表すコンセプトである。

input_or_output_iteratorはイテレータコンセプトの基礎となるコンセプトであり、イテレータに対する最小の要件である。全てのイテレータは本コンセプトのモデルとならなければならない。

備考

名前にinput_or_outputとあるがこれはイテレータ分類としてのそれらの共通部分のような意味であり、このコンセプトはイテレータを介した入出力やイテレータのコピー、イテレータの比較についてを何ら制約しない。

#include <iostream>
#include <concepts>
#include <iterator>
#include <memory>
#include <vector>

template<std::input_or_output_iterator I>
void f(const char* name) {
  std::cout << name << " is input_or_output_iterator" << std::endl;
}

template<typename I>
void f(const char* name) {
  std::cout << name << " is not input_or_output_iterator" << std::endl;
}


struct sample_input_or_output_iterator {
  friend auto operator++(sample_input_or_output_iterator&) -> sample_input_or_output_iterator&;
  friend auto operator++(sample_input_or_output_iterator&, int) -> sample_input_or_output_iterator;

  friend auto operator*(sample_input_or_output_iterator&) -> int;

  using difference_type = int;
};

struct sample_weak_incrementable {
  friend auto operator++(sample_weak_incrementable&) -> sample_weak_incrementable&;
  friend auto operator++(sample_weak_incrementable&, int) -> sample_weak_incrementable&;  

  using difference_type = int;
};


int main() {
  f<int*>("int*");
  f<const int*>("const int*");
  f<std::vector<int>::iterator>("std::vector<int>::iterator");
  f<std::ostream_iterator<double>>("std::ostream_iterator<double>");
  f<sample_input_or_output_iterator>("sample_input_or_output_iterator");

  std::cout << "\n";
  f<int* const>("int* const");
  f<sample_weak_incrementable>("sample_weak_incrementable");
}

出力

int* is input_or_output_iterator
const int* is input_or_output_iterator
std::vector<int>::iterator is input_or_output_iterator
std::ostream_iterator<double> is input_or_output_iterator
sample_input_or_output_iterator is input_or_output_iterator

int* const is not input_or_output_iterator
sample_weak_incrementable is not input_or_output_iterator

バージョン

言語

  • C++20

処理系

関連項目

参照