std::common_type

来自cppreference.com
< cpp‎ | types

 
 
 
类型的支持
基本类型
基础类型
定宽整数类型 (C++11)
数值极限
numeric_limits
C 数值极限接口
运行时类型信息
类型特性
类型类别
is_void(C++11)
is_null_pointer(C++14)
is_array(C++11)
is_pointer(C++11)
is_enum(C++11)
is_union(C++11)
is_class(C++11)
is_function(C++11)
is_object(C++11)
is_scalar(C++11)
is_compound(C++11)
is_integral(C++11)
is_floating_point(C++11)
is_fundamental(C++11)
is_arithmetic(C++11)
is_reference(C++11)
is_lvalue_reference(C++11)
is_rvalue_reference(C++11)
is_member_pointer(C++11)
is_member_object_pointer(C++11)
is_member_function_pointer(C++11)
类型属性
is_const(C++11)
is_volatile(C++11)
is_pod(C++11)
is_empty(C++11)
is_polymorphic(C++11)
is_final(C++14)
is_abstract(C++11)
is_trivial(C++11)
is_trivially_copyable(C++11)
is_standard_layout(C++11)
is_literal_type(C++11)(C++17中过时)
is_aggregate(C++17)
is_signed(C++11)
is_unsigned(C++11)
has_unique_object_representations(C++17)
类型特性常量
integral_constant
bool_constant
true_type
false_type
(C++11)
(C++17)
(C++11)
(C++11)
元函数
conjunction(C++17)
disjunction(C++17)
negation(C++17)
受支持操作
is_constructible
is_trivially_constructible
is_nothrow_constructible
(C++11)
(C++11)
(C++11)
is_default_constructible
is_trivially_default_constructible
is_nothrow_default_constructible
(C++11)
(C++11)
(C++11)
is_copy_constructible
is_trivially_copy_constructible
is_nothrow_copy_constructible
(C++11)
(C++11)
(C++11)
is_move_constructible
is_trivially_move_constructible
is_nothrow_move_constructible
(C++11)
(C++11)
(C++11)
is_assignable
is_trivially_assignable
is_nothrow_assignable
(C++11)
(C++11)
(C++11)
is_copy_assignable
is_trivially_copy_assignable
is_nothrow_copy_assignable
(C++11)
(C++11)
(C++11)
is_move_assignable
is_trivially_move_assignable
is_nothrow_move_assignable
(C++11)
(C++11)
(C++11)
is_destructible
is_trivially_destructible
is_nothrow_destructible
(C++11)
(C++11)
(C++11)
has_virtual_destructor(C++11)
is_swappable_with
is_swappable
is_nothrow_swappable_with
is_nothrow_swappable
(C++17)
(C++17)
(C++17)
(C++17)
关系与属性查询
is_same(C++11)
is_base_of(C++11)
is_convertible(C++11)
alignment_of(C++11)
rank(C++11)
extent(C++11)
is_invocable
is_invocable_r
is_nothrow_invocable
is_nothrow_invocable_r
(C++17)
(C++17)
(C++17)
(C++17)
类型修改
remove_cv
remove_const
remove_volatile
(C++11)
(C++11)
(C++11)
add_cv
add_const
add_volatile
(C++11)
(C++11)
(C++11)
make_signed(C++11)
make_unsigned(C++11)
类型变换
aligned_storage(C++11)
aligned_union(C++11)
decay(C++11)
enable_if(C++11)
void_t(C++17)
conditional(C++11)
common_type(C++11)
underlying_type(C++11)
result_of
invoke_result
(C++11)(C++17中过时)
(C++17)
 
定义于头文件 <type_traits>
template< class... T >
struct common_type;
(C++11 起)
确定各类型T...常见的类型,这是所有T...可以隐式类型转换为.
原文:
Determines the common type among all types T..., that is the type all T... can be implicitly converted to.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • std::common_type可能是专门为自定义类型,例如std::chrono::time_point.
    原文:
    std::common_type may be specialized for custom types, e.g. std::chrono::time_point.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 对于非专门std::common_type,每对之间的常见的类型的规则用于确定T1, T2是完全相同的规则用于确定返回类型的三元条件运算符T1T2是它的第二个和第三个操作数的类型.
    原文:
    For non-specialized std::common_type, the rules for determining the common type between every pair T1, T2 are exactly the rules for determining the return type of the 三元条件运算符 where T1 and T2 are the types of its second and the third operands.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 对于算术类型,常见的类型也可以被视为类型的(可能是混合模式)的算术表达式,如T0() + T1() + ... + Tn().
    原文:
    For arithmetic types, the common type may also be viewed as the type of the (possibly mixed-mode) arithmetic expression such as T0() + T1() + ... + Tn().
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

目录

[编辑] 会员类型

姓名
原文:
Name
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
Definition
type
所有T...常见的类型
原文:
the common type for all T...
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 专业化

自定义的类型特征std::common_type专业是允许的。以下专业的标准库已经提供了
原文:
Custom specializations of the type trait std::common_type are allowed. The following specializations are already provided by the standard library:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
特化的std::common_type特征
原文:
specializes the std::common_type trait
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(类模板特化) [edit]
专业的std::common_type特征
原文:
specializes the std::common_type trait
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(类模板特化) [edit]

[编辑] 注释

随着一个单独的模板参数,std::common_type<T>::type正是T,这使得它在C + +相当于boost::identity<T>
原文:
With a single template argument, std::common_type<T>::type is exactly T, which makes it the C++ equivalent of boost::identity<T>
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 可能的实现

template<class ...T> struct common_type;
 
template<class T>
struct common_type<T> {
    typedef T type;
};
 
template<class T, class U>
struct common_type<T, U> {
    typedef decltype(true ? declval<T>() : declval<U>()) type;
};
 
template<class T, class U, class... V>
struct common_type<T, U, V...> {
    typedef typename common_type<typename common_type<T, U>::type, V...>::type type;
};

[编辑] 示例

一个用户定义的类演示混合模式运算
原文:
Demonstrates mixed-mode arithmetic on a user-defined class
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

#include <iostream>
#include <type_traits>
 
template<class T>
struct Number { T n; };
 
template<class T, class U>
Number<typename std::common_type<T, U>::type> operator+(const Number<T>& lhs,
                                                        const Number<U>& rhs)
{
    return {lhs.n + rhs.n};
}
 
int main()
{
    Number<int> i1 = {1}, i2 = {2};
    Number<double> d1 = {2.3}, d2 = {3.5};
    std::cout << "i1i2: " << (i1 + i2).n << "\ni1d2: " << (i1 + d2).n << '\n'
              << "d1i2: " << (d1 + i2).n << "\nd1d2: " << (d1 + d2).n << '\n';
}

输出:

i1i2: 3
i1d2: 4.5
d1i2: 4.3
d1d2: 5.8