网站原型图展示,wordpress微信登录设置密码,做推送的网站有哪些,搜狗推广入口类型特性
类型特性定义一个编译时基于模板的结构#xff0c;以查询或修改类型的属性。
试图特化定义于 type_traits 头文件的模板导致未定义行为#xff0c;除了 std::common_type 可依照其所描述特化。
定义于type_traits头文件的模板可以用不完整类型实…类型特性
类型特性定义一个编译时基于模板的结构以查询或修改类型的属性。
试图特化定义于 type_traits 头文件的模板导致未定义行为除了 std::common_type 可依照其所描述特化。
定义于type_traits头文件的模板可以用不完整类型实例化除非另外有指定尽管通常禁止以不完整类型实例化标准库模板。
杂项变换
确定一组类型的公共类型
std::common_type template class... T struct common_type; (C11 起)
确定所有类型 T... 的共用类型即所有 T... 都能隐式转换到的类型。若这种类型根据后述规则确定存在则成员 type 指名该类型。否则无成员 type 。
若 sizeof...(T) 为零则无成员 type 。若 sizeof...(T) 为一即 T... 只含一个类型 T0 则成员 type 指名与 std::common_typeT0, T0::type 相同的类型若它存在否则无成员 type 。若 sizeof...(T) 为二即 T... 含恰好二个成员 T1 与 T2 则
若应用 std::decay 到至少 T1 与 T2 中至少一个类型后产生相异类型则成员 type 指名与 std::common_typestd::decayT1::type, std::decayT2::type::type 相同的类型若它存在若不存在则无成员 type 。否则若有对 std::common_typeT1, T2 的用户定义特化则使用该特化否则 若 std::decaydecltype(false ? std::declvalT1() : std::declvalT2())::type 是合法类型则成员 type 代表该类型 否则若 std::decaydecltype(false ? std::declvalconst T1 () : std::declvalconst T2 ())::type 为合法类型则成员 type 代表该类型 (C20 起)
否则无成员 type 。
若 sizeof...(T) 大于二即 T... 由类型 T1, T2, R... 组成则若 std::common_typeT1, T2::type 存在则成员 type 指代 std::common_typestd::common_typeT1, T2::type, R...::type 若存在这种类型。其他所有情况下无成员 type 。
参数包 T 中的类型应均为完整类型、可为 cv 限定的 void 或未知边界数组。否则行为未定义。
若上述模板的实例化直接或间接地依赖于不完整类型并且如果假如使该类型完整实例化就会产生不同的结果则行为未定义。
成员类型
名称定义type所有 T... 的共用类型
辅助类型 template class... T using common_type_t typename common_typeT...::type; (C14 起)
特化
用户可为类型 T1 与 T2 特化 common_type 只要
T1 与 T2 至少一个依赖于用户定义类型且std::decay 对于 T1 和 T2 都是同等变换。
若这种特化拥有名为 type 的成员则它必须是公开且无歧义的成员类型并指名一个 T1 和 T2 都能显式转换到的无 cv 限定且非引用的类型。而且 std::common_typeT1, T2::type 与 std::common_typeT2, T1::type 必须指代同一类型。
以违背这些规则的方式添加 common_type 特化的程序拥有未定义行为。
注意添加特化到来自 type_traits 的任何其他模板的行为是未定义的。
标准库已提供下列特化 std::common_typestd::chrono::duration 特化 std::common_type 特征 (类模板特化) std::common_typestd::chrono::time_point 特化 std::common_type 特征 (类模板特化)
可能的实现
// 初等模板用于零个类型
template class ...T struct common_type { }; 一个类型
template class T
struct common_typeT {using type typename common_typeT, T::type;
};二个类型// 二个类型的默认实现
templateclass T1, class T2
using cond_t decltype(false ? std::declvalT1() : std::declvalT2());templateclass T1, class T2, classvoid
struct common_type_2_default { };templateclass T1, class T2
struct common_type_2_defaultT1, T2, std::void_tcond_tT1, T2 {using type std::decay_tcond_tT1, T2;
};// 退化应用特化前的类型的派发器
templateclass T1, class T2, class D1 std::decay_tT1, class D2std::decay_tT2
struct common_type_2_impl : common_typeD1, D2 {};templateclass D1, class D2
struct common_type_2_implD1, D2, D1, D2 : common_type_2_defaultD1, D2 {};template class T1, class T2
struct common_typeT1, T2 : common_type_2_implT1, T2 { };3 个以上类型templateclass AlwaysVoid, class T1, class T2, class...R
struct common_type_multi_impl { };template class T1, class T2, class...R
struct common_type_multi_implstd::void_tcommon_type_tT1, T2, T1, T2, R...: common_typecommon_type_tT1, T2, R... { };template class T1, class T2, class... R
struct common_typeT1, T2, R...: common_type_multi_implvoid, T1, T2, R... { };
注意
对于不是提升目标的算术类型共用类型可视为如 T0() T1() ... Tn() 的可以为混合模式的算术表达式的类型。
调用示例
#include iostream
#include type_traits
#include typeinfostruct C
{
};struct A : C
{
};struct B : C
{
};int main()
{typedef typename std::common_typeint, double::type Type1;typedef typename std::common_typechar, int::type Type2;typedef typename std::common_typestd::string, char*::type Type3;typedef typename std::common_typebool, int::type Type4;typedef typename std::common_typebool, char::type Type5;typedef typename std::common_typechar, double::type Type6;typedef typename std::common_typeA, C, B::type Type7;std::cout std::common_typeint, double::type: typeid(Type1).name() std::endl;std::cout std::common_typechar, int::type: typeid(Type2).name() std::endl;std::cout std::common_typestd::string,double::type: typeid(Type3).name() std::endl;std::cout std::common_typebool, int::type: typeid(Type4).name() std::endl;std::cout std::common_typebool, int::type: typeid(Type5).name() std::endl;std::cout std::common_typechar, double::type: typeid(Type6).name() std::endl;std::cout std::common_typeA, C, B::type: typeid(Type7).name() std::endl;return 0;
}输出
std::common_typeint, double::type: d
std::common_typechar, int::type: i
std::common_typestd::string,double::type: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
std::common_typebool, int::type: i
std::common_typebool, int::type: i
std::common_typechar, double::type: d
std::common_typeA, C, B::type: 1C