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

履歴 編集

concept
<iterator>

std::indirectly_swappable(C++20)

namespace std {
  template<class I1, class I2 = I1>
  concept indirectly_swappable =
    indirectly_readable<I1> && indirectly_readable<I2> &&
    requires(const I1 i1, const I2 i2) {
      ranges::iter_swap(i1, i1);
      ranges::iter_swap(i2, i2);
      ranges::iter_swap(i1, i2);
      ranges::iter_swap(i2, i1);
    };
}

概要

indirectly_swappableは、indirectly_readableな型I1, I2の参照する要素のオブジェクトがswap可能であることを表すコンセプトである。

単純には、型I1, I2のオブジェクトをそれぞれi1, i2とするとstd::ranges::swap(*i1, *i2)のような交換操作が可能であることを表している。

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

template<typename I1, typename I2>
  requires std::indirectly_swappable<I1, I2>
void f(const char* nameI1, const char* nameI2) {
  std::cout << nameI1 << " is indirectly_swappable " << nameI2 << std::endl;
}

template<typename I1, typename I2>
void f(const char* nameI1, const char* nameI2) {
  std::cout << nameI1 << " is not indirectly_swappable " << nameI2 << std::endl;
}


struct del_copy_ctor {
  del_copy_ctor(const del_copy_ctor&) = delete;
};

int main() {
  f<int*, int* const>("int*", "int* const");
  f<std::unique_ptr<int>, int*>("std::unique_ptr<int>", "int*");
  f<std::vector<int>::iterator, std::unique_ptr<int>>("std::vector<int>::iterator", "std::unique_ptr<int>");

  std::cout << "\n";
  f<int*, const int*>("int*", "const int*");
  f<std::istream_iterator<int>, std::vector<int>::iterator>("std::istream_iterator<int>", "std::vector<int>::iterator");
  f<std::istream_iterator<int>, std::ostream_iterator<int>>("std::istream_iterator<int>", "std::ostream_iterator<int>");
  f<del_copy_ctor*, del_copy_ctor*>("del_copy_ctor*", "del_copy_ctor*");
}

出力

int* is indirectly_swappable int* const
std::unique_ptr<int> is indirectly_swappable int*
std::vector<int>::iterator is indirectly_swappable std::unique_ptr<int>

int* is not indirectly_swappable const int*
std::istream_iterator<int> is not indirectly_swappable std::vector<int>::iterator
std::istream_iterator<int> is not indirectly_swappable std::ostream_iterator<int>
del_copy_ctor* is not indirectly_swappable del_copy_ctor*

バージョン

言語

  • C++20

処理系

関連項目

参照