名前空間
変種
操作

std::indirectly_readable_traits

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
(C++17で非推奨)
indirectly_readable_traits
(C++20)


アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダ <iterator> で定義
template< class I >
struct indirectly_readable_traits {};
(1) (C++20以降)
template< class T >

struct indirectly_readable_traits<T*> :

    /* cond-value-type */<T> {};
(2) (C++20以降)
template< class I >

    requires std::is_array_v<I>
struct indirectly_readable_traits<I>;

{ using value_type = std::remove_cv_t<std::remove_extent_t<I>>; }
(3) (C++20以降)
template< class T >

struct indirectly_readable_traits<const T> :

    indirectly_readable_traits<T> {};
(4) (C++20以降)
template< /* has-member-value-type */ T >

struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::value_type> {};
(5) (C++20以降)
template< /* has-member-element-type */ T >

struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::element_type> {};
(6) (C++20以降)
template< /* has-member-value-type */ T >

    requires /* has-member-element-type */<T>

struct indirectly_readable_traits<T> {};
(7) (C++20以降)
template< /* has-member-value-type */ T >

    requires /* has-member-element-type */<T> &&
             std::same_as<std::remove_cv_t<typename T::element_type>,
                          std::remove_cv_t<typename T::value_type>>
struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::value_type> {};
(8) (C++20以降)
ヘルパークラスとコンセプト
template< class >
struct /* cond-value-type */ {};
(1) (説明用*)
template< class T >

    requires std::is_object_v<T>
struct /* cond-value-type */ <T>

{ using value_type = std::remove_cv_t<T>; };
(2) (説明用*)
template< class T >

concept /* has-member-value-type */ =

    requires { typename T::value_type; };
(3) (説明用*)
template< class T >

concept /* has-member-element-type */ =

    requires { typename T::element_type; };
(4) (説明用*)

テンプレート引数の関連付けられた値型を計算します。関連付けられた値型が存在する場合、それはネストされた型value_typeで表されます。存在しない場合はvalue_typeは定義されません。プログラムは、プログラム定義型に対してindirectly_readable_traitsを特殊化できます。

目次

[編集] 説明

上記の特殊化は、以下のように非公式に説明できます。

Tが与えられた場合、その関連付けられた値型Vは次のように決定されます。

  • Tがconst修飾されている場合、Vはconst修飾されていないTの関連付けられた値型です。
  • それ以外の場合、Tが配列型である場合、Vはcv修飾されていない配列要素型です。
  • それ以外の場合、まず条件付き値型Cが決定されます。
  • Tがポインタ型である場合、Cはポインタが指す型です。
  • それ以外の場合、Tがネストされた型value_typeelement_typeを持つ場合
  • これらの型が同じ(cv修飾を考慮しない)場合、Ctypename T::value_typeです。
  • それ以外の場合、Cは未定義です。
  • それ以外の場合、Tがネストされた型value_typeを持つがelement_typeは持たない場合、Ctypename T::value_typeです。
  • それ以外の場合、Tがネストされた型element_typeを持つがvalue_typeは持たない場合、Ctypename T::element_typeです。
  • それ以外の場合、Cは未定義です。
次にVCから次のように決定されます。
  • Cが未定義であるか、またはCオブジェクト型でない場合、Vは未定義です。
  • それ以外の場合、Vはcv修飾されていないCです。

[編集] 注記

value_typeは、イテレータのようなindirectly_readable型との使用を意図しています。範囲との使用は意図していません。

[編集]

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3446 C++20 型が持つ場合、特殊化 (5,6) は曖昧でした。
value_typeelement_typeのネストされた型
特殊化 (8) を追加しました。
LWG 3541 C++20 LWG 3446 は、曖昧なケースに対してハードエラーを導入しました。
value_typeelement_typeが異なること。
特殊化 (7) を追加しました。

[編集] 関連項目

型が演算子 * を適用することで間接的に読み取り可能であることを規定する
(コンセプト) [編集]
イテレータの関連型を計算する
(エイリアステンプレート)[編集]
イテレータのプロパティへの統一的なインターフェースを提供する
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)