std::experimental::ranges:: common_type
|
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表示该类型; -
否则,成员
type表示类型 std:: decay_t < decltype ( false ? std:: declval < const T1 & > ( ) : std:: declval < const T2 & > ( ) ) > (若该条件表达式合法);否则不存在成员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。
目录 |
成员类型
| 名称 | 定义 |
type
|
所有
T...
的通用类型
|
辅助类型
|
template
<
class
...
T
>
using common_type_t = typename common_type < T... > :: type ; |
||
特化
用户可以为类型
T1
和
T2
特化
common_type
,如果
-
至少有一个
T1或T2依赖于用户定义类型,且 -
对于
T1和T2两者, std::decay 均为恒等变换。
若此类特化具有名为
type
的成员,则其必须是公开且无歧义的成员类型,该类型需命名一个cv非限定的非引用类型,且
T1
和
T2
均可显式转换至该类型。此外,
ranges
::
common_type_t
<
T1, T2
>
与
ranges
::
common_type_t
<
T2, T1
>
必须表示同一类型。
违反这些规则添加
common_type
特化的程序将导致未定义行为。
注释
对于不进行提升的算术类型,公共类型可被视为(可能是混合模式的)算术表达式类型,例如 T0 ( ) + T1 ( ) + ... + Tn ( ) 。
示例
|
本节内容不完整
原因:缺少示例 |
参见
|
(C++11)
|
确定一组类型的公共类型
(类模板) |
|
确定一组类型的公共引用类型
(类模板) |