std::experimental::ranges::common_type
From cppreference.com
< cpp | experimental | ranges
| Defined in header <experimental/ranges/type_traits> |
||
| template< class... T > struct common_type; |
(ranges TS) | |
T... のすべての型の中から共通の型を決定します。つまり、すべての T... が暗黙的に変換できる型です。そのような型が存在する場合(以下の規則に従って決定される)、メンバ type はその型を名前付けします。それ以外の場合は、メンバ type は存在しません。T... の型の中に、( cv修飾された) void 以外の不完全型が含まれている場合、動作は未定義です。
- sizeof...(T) がゼロの場合、メンバー
typeは存在しません。 - sizeof...(T) が 1 である場合(つまり、
T...に型T0のみが含まれる場合)、メンバtypeは std::decay_t<T0> と同じ型を名前付けします。 - sizeof...(T) が 2 である場合(つまり、
T...に型T1およびT2の 2 つの型が含まれる場合)、
T1およびT2の少なくとも一方に std::decay を適用した結果が異なる型になる場合、メンバtypeは ranges::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...が型T1、T2、およびR...からなる場合)、ranges::common_type_t<T1, T2> が存在する場合、メンバtypeは ranges::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::decay が
T1とT2の両方に対して恒等変換であること。
そのような特殊化が type という名前のメンバを持つ場合、それは public かつ曖昧さのないメンバ型でなければならず、cv-修飾されていない非参照型を指さなければなりません。この型には、T1 と T2 の両方を明示的に変換可能でなければなりません。さらに、ranges::common_type_t<T1, T2> および ranges::common_type_t<T2, T1> は同じ型を指さなければなりません。
これらの規則に違反して common_type の特殊化を追加するプログラムは、未定義の動作を引き起こします。
[編集] 注釈
昇格の対象とならない算術型の場合、共通の型は、(混合モードの可能性のある) 算術式 T0() + T1() + ... + Tn() の型と見なすことができます。
[編集] 例
| このセクションは未完成です 理由: 例がありません |
[編集] 関連項目
| (C++11) |
型のグループの共通の型を決定する (クラステンプレート) |
| 型の共通参照型を決定します。 (class template) |