2016-04-09 50 views
3

自从C++ 11引入类型特征std::common_type以来。 std::common_type确定所有模板参数之间的通用类型。在C++ 14中,为了使使用std::common_type类型特征的代码更短,还引入了帮助类型std::common_type_t用户定义类型的std :: common_type trait

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 

Q:我怎样才能让std::common_type与用户定义类型特质的工作?

回答

8

根据该草案标准N4582§20.13.2部首概要[meta.type.synop](重点煤矿)

的程序的,增加了特任何的 模板的行为在本条款中定义为未定义,除非另有规定

因此,增加特供type_traits可能会导致不确定的行为,除非其他标准的某处有该取代上面显示的文字特定类型性状的措辞。幸运的是,表60 - 其他转换

enter image description here

有措辞:

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

这意味着具有至少一个用户定义类型的std::common_type类型特征的特化是完全允许的。事实上,如果您看看§20.15.4.3common_type [time.traits.specializations]的专业化版本,您会发现STL已经为用户定义的类型std::chrono::durationstd::chrono::time_point定义了std::common_type的专业化版本。

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

struct A {}; 
struct B {}; 

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

在代码示例上面我们指定该共同AB之间的类型为A