gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:01 27 4
gpt4 key购买 nike

自 C++11 以来,引入了类型特征 std::common_typestd::common_type 确定其所有模板参数之间的公共(public)类型。在 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 特性与用户定义的类型一起工作?

最佳答案

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

The behavior of a program that adds specializations for any of the templates defined in this subclause is undefined unless otherwise specified.

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

enter image description here

有这样的措辞:

A program may specialize this trait if at least one template parameter in the specialization is a user-defined type. [ Note: Such specializations are needed when only explicit conversions are desired among the template arguments. — end note ]

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

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

struct A {};
struct B {};

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

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

关于c++ - 用户定义类型的 std::common_type 特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523038/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com