std::experimental::ranges::common_type
来自 cppreference.com
< cpp | experimental | ranges
定义在头文件 <experimental/ranges/type_traits> 中 |
||
template< class... T > struct common_type; |
(范围 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
),
- 如果将 std::decay 应用于
T1
和T2
中至少一个类型会产生不同的类型,则成员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
表示该类型; - 否则,成员
type
将表示类型 std::decay_t<decltype(false ? std::declval<const T1&>() : std::declval<const T2&>())>,如果该条件表达式形成良好;如果不存在,则没有成员type
。
- 如果将 std::decay 应用于
- 如果 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) |
确定一组类型的公共类型 (类模板) |
确定一组类型的公共引用类型 (类模板) |