自C ++ 11以来,引入了类型特征std::common_type
。 std::common_type
确定其所有模板参数之间的公共类型。在C ++ 14中,还引入了辅助类型std::common_type_t
,以便使使用std::common_type
类型特征的代码更短。
std::common_type
在重载算术运算符中特别有用,例如
template<typename T1, typename T2>
std::common_type_t<T1, T2> operator+(T1 const &t1, T2 const &t2) {
return t1 + t2;
}
如果模板参数是以类型构建的(例如int
,double
),它可以正常工作。但是,如果我提供用户定义类型的模板参数,例如。,
struct A {};
struct B {};
std::common_type_t<A, B> // doesn't work
问:如何使用std::common_type
特征使用用户定义的类型?
答案 0 :(得分:11)
根据标准草案N4582 §20.13.2标题概要[meta.type.synop](强调我的):
为任何一个添加特化的程序的行为 除非另有说明,否则本子条款中定义的模板未定义 指定的强>
因此,为type_traits
添加特化可能会导致未定义的行为,除非标准中的其他位置有特定类型特征的措辞,否则将取代上面显示的措辞。幸运的是,在表60 - 其他转换:
有措辞:
如果至少有一个模板参数,程序可以专门化这个特征 在专业化中是用户定义的类型。 [注意:这样 只需要显式转换时需要特化 在模板参数中。 - 结束说明]
这意味着完全允许具有至少一个用户定义类型的std::common_type
类型特征的特化。实际上,如果你看一下common_type [time.traits.specializations] 的§20.15.4.3特化,你会发现STL已经为用户定义的类型定义了std::common_type
的特化{ {1}}和std::chrono::duration
。
因此,使std::chrono::time_point
“工作”用于用户定义类型的正确方法是为这些特定类型提供特殊化,例如,
common_type
在上面的代码示例中,我们指定struct A {};
struct B {};
namespace std {
template<>
struct common_type<A, B> {
using type = A;
};
}
和A
之间的公共类型为B
。