用户定义类型的std :: common_type trait

时间:2016-04-09 21:39:55

标签: c++ templates c++11 c++14 typetraits

自C ++ 11以来,引入了类型特征std::common_typestd::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;
}

如果模板参数是以类型构建的(例如intdouble),它可以正常工作。但是,如果我提供用户定义类型的模板参数,例如。,

,我似乎无法工作
struct A {};
struct B {};

std::common_type_t<A, B> // doesn't work

:如何使用std::common_type特征使用用户定义的类型?

1 个答案:

答案 0 :(得分:11)

根据标准草案N4582 §20.13.2标题概要[meta.type.synop](强调我的)

  

为任何一个添加特化的程序的行为   除非另有说明,否则本子条款中定义的模板未定义   指定的

因此,为type_traits添加特化可能会导致未定义的行为,除非标准中的其他位置有特定类型特征的措辞,否则将取代上面显示的措辞。幸运的是,在表60 - 其他转换

enter image description here

有措辞:

  

如果至少有一个模板参数,程序可以专门化这个特征   在专业化中是用户定义的类型。 [注意:这样   只需要显式转换时需要特化   在模板参数中。 - 结束说明]

这意味着完全允许具有至少一个用户定义类型的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