名前空間
変種
操作

std::experimental::ranges::common_type

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
汎用ユーティリティライブラリ
ユーティリティコンポーネント
関数オブジェクト
メタプログラミングと型特性
common_type
タグ付きペアとタプル
                          
タグ指定子
                                      
                          
 
template< class... T >
struct common_type;
(ranges TS)

T... のすべての型の中から共通の型を決定します。つまり、すべての T... が暗黙的に変換できる型です。そのような型が存在する場合(以下の規則に従って決定される)、メンバ type はその型を名前付けします。それ以外の場合は、メンバ type は存在しません。T... の型の中に、( cv修飾された) void 以外の不完全型が含まれている場合、動作は未定義です。

  • sizeof...(T) がゼロの場合、メンバー type は存在しません。
  • sizeof...(T) が 1 である場合(つまり、T... に型 T0 のみが含まれる場合)、メンバ typestd::decay_t<T0> と同じ型を名前付けします。
  • sizeof...(T) が 2 である場合(つまり、T... に型 T1 および T2 の 2 つの型が含まれる場合)、
  • T1 および T2 の少なくとも一方に std::decay を適用した結果が異なる型になる場合、メンバ typeranges::common_type_t<std::decay_t<T1>, std::decay_t<T2>> と同じ型を名前付けします。そのような型が存在しない場合は、メンバ type は存在しません。
  • それ以外の場合(および ranges::common_type<T1, T2> のためのユーザー定義の特殊化が存在しない場合)、std::common_type_t<T1, T2> が well-formed であれば、メンバ type はその型を指します。
  • それ以外の場合、メンバ type は、条件式 false ? std::declval<const T1&>() : std::declval<const T2&>()decltype の結果である std::decay_t<decltype(false ? std::declval<const T1&>() : std::declval<const T2&>())> という型を指します。もしこの条件式が well-formed でない場合は、メンバ type は存在しません。
  • sizeof...(T) が 2 より大きい場合(つまり、T... が型 T1T2、および R... からなる場合)、ranges::common_type_t<T1, T2> が存在する場合、メンバ typeranges::common_type_t<ranges::common_type_t<T1, T2>, R...> という型を指します(そのような型が存在する場合)。それ以外の場合は、メンバ type は存在しません。

目次

[編集] メンバ型

名前 定義
type すべての T... の共通の型

[編集] ヘルパー型

template< class... T >
using common_type_t = typename common_type<T...>::type;

[編集] 特殊化

ユーザーは、型 T1 および T2 に対して common_type を特殊化できます。ただし、以下の条件を満たす必要があります。

  • T1 および T2 の少なくとも一方がユーザー定義型に依存しており、かつ
  • std::decayT1T2 の両方に対して恒等変換であること。

そのような特殊化が type という名前のメンバを持つ場合、それは public かつ曖昧さのないメンバ型でなければならず、cv-修飾されていない非参照型を指さなければなりません。この型には、T1T2 の両方を明示的に変換可能でなければなりません。さらに、ranges::common_type_t<T1, T2> および ranges::common_type_t<T2, T1> は同じ型を指さなければなりません。

これらの規則に違反して common_type の特殊化を追加するプログラムは、未定義の動作を引き起こします。

[編集] 注釈

昇格の対象とならない算術型の場合、共通の型は、(混合モードの可能性のある) 算術式 T0() + T1() + ... + Tn() の型と見なすことができます。

[編集]

[編集] 関連項目

型のグループの共通の型を決定する
(クラステンプレート) [編集]
型の共通参照型を決定します。
(class template) [編集]
English 日本語 中文(简体) 中文(繁體)