std::experimental::ranges::common_type
來自 cppreference.com
< cpp | experimental | ranges
template< class... T > struct common_type; |
(ranges TS) | |
確定所有型別 T...
的公共型別,即所有 T...
都可以隱式轉換為的型別。如果存在這樣的型別(根據以下規則確定),則成員 type
命名該型別。否則,不存在成員 type
。如果 T...
中的任何型別是不完整型別(除了(可能帶有 cv 限定符的)void),則行為未定義。
- 如果 sizeof...(T) 為零,則沒有成員 `type`。
- 如果 sizeof...(T) 為一(即
T...
只包含一個型別T0
),則成員type
命名與 std::decay_t<T0> 相同的型別。 - 如果 sizeof...(T) 為二(即
T...
恰好包含兩個型別T1
和T2
),
- 如果對
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> 格式良好,則成員
type
指示該型別; - 否則,如果條件表示式 std::decay_t<decltype(false ? std::declval<const T1&>() : std::declval<const T2&>())> 格式良好,則成員
type
指示該型別;如果格式不良好,則沒有成員type
。
- 如果對
- 如果 sizeof...(T) 大於二(即
T...
由型別T1, T2, R...
組成),那麼如果 ranges::common_type_t<T1, T2> 存在,則成員type
指示 ranges::common_type_t<ranges::common_type_t<T1, T2>, R...>(如果存在這樣的型別)。在所有其他情況下,沒有成員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
的成員,它必須是一個公共且明確的成員型別,它命名一個 cv-非限定的非引用型別,並且 T1
和 T2
都可以顯式轉換為該型別。此外,ranges::common_type_t<T1, T2> 和 ranges::common_type_t<T2, T1> 必須表示相同的型別。
違反這些規則新增 common_type
特化的程式具有未定義行為。
[編輯] 注意
對於不受提升的算術型別,公共型別可以看作是(可能混合模式的)算術表示式的型別,例如 T0() + T1() + ... + Tn()。
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 另請參閱
(C++11) |
確定一組型別的公共型別 (類模板) |
確定一組型別的公共引用型別 (類模板) |