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

履歴 編集

function template
<algorithm>

std::ranges::in_in_out_result(C++20)

namespace std::ranges {
  // (1)
  template<class I1, class I2, class O>
  struct in_in_out_result {
    [[no_unique_address]] I1 in1;
    [[no_unique_address]] I2 in2;
    [[no_unique_address]] O  out;

    template<class II1, class II2, class OO>
      requires convertible_to<const I1&, II1> &&
               convertible_to<const I2&, II2> &&
               convertible_to<const O&, OO>
    constexpr operator in_in_out_result<II1, II2, OO>() const & {
      return {in1, in2, out};
    }

    template<class II1, class II2, class OO>
      requires convertible_to<I1, II1> &&
               convertible_to<I2, II2> &&
               convertible_to<O, OO>
    constexpr operator in_in_out_result<II1, II2, OO>() && {
      return {std::move(in1), std::move(in2), std::move(out)};
    }
  };

  // (2)
  template<class I1, class I2, class O>
  using binary_transform_result = in_in_out_result<I1, I2, O>;

  // (3)
  template<class I1, class I2, class O>
  using merge_result  = in_in_out_result<I1, I2, O>;

  // (4)
  template<class I1, class I2, class O>
  using set_union_result  = in_in_out_result<I1, I2, O>;

  // (5)
  template<class I1, class I2, class O>
  using set_intersection_result  = in_in_out_result<I1, I2, O>;

  // (6)
  template<class I1, class I2, class O>
  using set_symmetric_difference_result = in_in_out_result<I1, I2, O>;
}

概要

この型は、関数が2つの入力用の範囲と出力用の範囲を受け取る場合に、それぞれ処理した範囲の末尾を返すために使用される。

標準アルゴリズム関数ではこの型を直接返す代わりに、関数毎にエイリアスを定義している。

メンバ変数

名前 説明 対応バージョン
[[no_unique_address]] I1 in1 1つめの処理した範囲の末尾 C++20
[[no_unique_address]] I2 in2 2つめの処理した範囲の末尾 C++20
[[no_unique_address]] O out 出力した範囲の末尾 C++20

メンバ関数

名前 説明 対応バージョン
operator in_in_out_result<II1, II2, OO> 変換演算子 C++20

変換演算子は、各テンプレートパラメーターが変換できる場合のみオーバーロード解決に参加する。

#include <algorithm>
#include <vector>
#include <string>
#include <cassert>

int main() {
  std::vector<char> v1 = { 'a','b','c','d','e' };
  std::vector<int> v2 = { 3,1,4 };
  std::vector<std::string> outs(3);

  // v1[n] の文字を v2[n] 回繰り返した文字列を返す
  const std::ranges::in_in_out_result result = std::ranges::transform(v1, v2, outs.begin(), [](char a, int b) { return std::string(b, a); });

  assert(result.in1 == v1.begin() + 3);
  assert(result.in2 == v2.begin() + 3);
  assert(result.out == outs.begin() + 3);
}

出力

バージョン

言語

  • C++20

処理系

参照