2016-04-09 51 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