2016-04-09 22 views
3

C++ 11'den itibaren std::common_type tür özelliği tanıtıldı. std::common_type, tüm şablon bağımsız değişkenleri arasındaki ortak türü belirler. C + + 14'te, std::common_type_t yardımcı tipi, std::common_type tipi özelliği daha kısa kullanan bir kod yapmak için tanıtılmıştır. onun şablonları argümanlar tiplerinde inşa edilir, düzgün çalışırstd :: common_type özelliği

template<typename T1, typename T2> 
std::common_type_t<T1, T2> operator+(T1 const &t1, T2 const &t2) { 
    return t1 + t2; 
} 

std::common_type, örneğin aşırı aritmetik operatörler özellikle yararlıdır (örneğin int, double). Ancak ben mesela kullanıcı tanımlı türleri olarak şablon argümanları sağlarsanız, çalışmak için görünmüyor

struct A {}; 
struct B {}; 

std::common_type_t<A, B> // doesn't work 

S: Ben kullanıcı tanımlı türleri ile std::common_type sürekli çalışması nasıl?

cevap

8

standart taslağa göre N4582§20.13.2 Üstbilgi özet [meta.type.synop] (vurgu Mayın):

şablonları için herhangi bir uzmanlık ekleyen bir programın davranışını Bu alt bölümde tanımlanan belirtilen tanımlanmamıştır. Yukarıda gösterilen ifadeleri yerini belirli bir tip özelliği için bir ifade var başka bir yerde standardında sürece

Sonuç olarak, type_traits için specializations ekleyerek tanımlanmamış bir davranışa neden olabilir. Neyse ki, Tablo 60 - Diğer dönüşümler: uzmanlaşma en az bir şablon parametresi kullanıcının tanımladığı ise

Bir program bu özelliği uzmanlaşabilir:

enter image description here

ifadeler var tanımlı tip. [Not: Şablon argümanları arasında yalnızca açık dönüşümler istendiğinde gibi uzmanlıklarına ihtiyaç vardır. - son not]

Bu, en az bir kullanıcı tanımlı tipe sahip std::common_type tipi özelliğinin uzmanlık mükemmel izin verildiği anlamına gelir. Aslında, §20.15.4.3 'e bakınız. Common_type [time.traits.specializations] uzmanlık alanları, kullanıcı tanımlı std::chrono::duration ve std::chrono::time_point türlerinde STL'nin zaten std::common_type uzmanlıklarını tanımladığını göreceksiniz.

Böylece, kullanıcı tanımlı türleri için common_type "iş" yapmak için doğru bir şekilde, örneğin, kod örneğinde

struct A {}; 
struct B {}; 

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

ortak belirtmek üzerinde, bu özel tipleri için bunun bir uzmanlık sağlamaktır A ve B arasındakiler A'dur.