Skip to content

Latest commit

 

History

History
60 lines (48 loc) · 1.87 KB

indirect_result_t.md

File metadata and controls

60 lines (48 loc) · 1.87 KB

indirect_result_t

  • iterator[meta header]
  • std[meta namespace]
  • type-alias[meta id-type]
  • cpp20[meta cpp]
namespace std {
  template<class F, class... Is>
    requires (indirectly_readable<Is> && ...) &&
             invocable<F, iter_reference_t<Is>...>
  using indirect_result_t = invoke_result_t<F, iter_reference_t<Is>...>;
}
  • indirectly_readable[link /reference/iterator/indirectly_readable.md]
  • invocable[link /reference/concepts/invocable.md]
  • iter_reference_t[link /reference/iterator/iter_reference_t.md]
  • invoke_result_t[link /reference/type_traits/invoke_result.md]

概要

関数呼び出し可能な型Fに間接参照可能な型(主にイテレータ型)Is...の指す要素を渡して呼び出した時の戻り値型を取得する。

#include <iterator>
#include <vector>
#include <string>

int main() {  
  using vec_iterator = std::vector<int>::iterator;
  using pointer = double*;

  using lambda1 = decltype([](int) -> std::size_t { return 0;});
  using lambda2 = decltype([](double) -> int { return 0;});
  using lambda3 = decltype([](int, int, double, double) -> std::string { return "";});

  static_assert(std::same_as<std::indirect_result_t<lambda1, vec_iterator>, std::size_t>);
  static_assert(std::same_as<std::indirect_result_t<lambda2, pointer>     , int>);
  static_assert(std::same_as<std::indirect_result_t<lambda3, vec_iterator, const vec_iterator, pointer, const pointer>, std::string>);
}
  • std::indirect_result_t[color ff0000]

出力

バージョン

言語

  • C++20

処理系

参照