【问题标题】:std::common_type trait for user defined types用户定义类型的 std::common_type 特征
【发布时间】:2016-07-31 02:25:02
【问题描述】:

从 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 trait 与用户定义的类型一起使用?

【问题讨论】:

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


    【解决方案1】:

    根据草案标准N4582§20.13.2 Header synopsis [meta.type.synop](Emphasis Mine)

    为任何 本小节中定义的模板是未定义的除非另有说明 指定

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

    有这样的措辞:

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

    这意味着完全允许具有至少一种用户定义类型的std::common_type 类型特征的特化。实际上,如果您查看 §20.15.4.3 特殊化 common_type [time.traits.specializations],您会发现 STL 已经为用户定义类型 std::chrono::duration 定义了 std::common_type 的特殊化和std::chrono::time_point

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

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

    在上面的代码示例中,我们指定AB 之间的公共类型是A

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多