用户定义类型的 std::common_type 特征

2024-03-13

自 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

Q: 我怎样才能做到std::common_type特征与用户定义的类型一起使用吗?


根据标准草案N4582 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf §20.13.2 标题概要 [meta.type.synop](重点是我的):

为任何以下项添加专业化的程序的行为 本节中定义的模板未定义除非另有 指定的.

因此,增加专业化type_traits可能会导致未定义的行为,除非标准中的其他地方有特定类型特征的措辞取代上面显示的措辞。幸运的是,在表 60 - 其他转换:

有这样的写法:

如果至少有一个模板参数,则程序可以专门化这一特征 专业化中是用户定义的类型。 [ 注:此类 当只需要显式转换时需要专门化 在模板参数中。 ——尾注]

这意味着专业化std::common_type完全允许具有至少一种用户定义类型的类型特征。事实上如果你看一下§20.15.4.3 common_type 的特化 [time.traits.specializations]你会发现STL已经定义了以下专业化std::common_type对于用户定义的类型std::chrono::duration and std::chrono::time_point.

因此,正确的制作方法是common_type用户定义类型的“工作”是为那些特定类型提供它的专业化,例如,

struct A {};
struct B {};

namespace std {
  template<>
  struct common_type<A, B> {
    using type = A;
  };
} 

在上面的代码示例中,我们指定了之间的公共类型A and B is A.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户定义类型的 std::common_type 特征 的相关文章

随机推荐