2016-11-28 14 views
7

benim bir kavram olduğunu varsayalım:Kavramdan tip nasıl alınır?

template < typename Group > concept bool GGroup = 
    requires() { typename Group::Inner; }; 
kısa formda kavramını kullanırken

nasıl türünü Inner alabilirsiniz ?

void doSomething(const GGroup& group) 
{ 
    // an ugly alternative 
    using Inner = typename std::decay_t<decltype(group)>::Inner; 

    //// could be something like: 
    // using Inner = GGroup::Inner; 
    // or 
    // using Inner = underlyingtype(GGroup)::Inner; 
} 
+1

Uzun biçim kullanımına ne dersiniz: 'template void doSomething (const Grup & grup) {... Grup :: İç ...}'? – ach

+0

@AndreyChernyakhovskiy Evet, ama asıl mesele bunu daha kısa biçimde yapmaktır. – Vahagn

+4

O zaman kendi amacınızı yenersiniz. Kısa formu (gerçek noktası gerçek tipteki gereksiz referansı ortadan kaldırmak için) kullanamazsınız ve aynı zamanda gerçek tipe de başvurunuz. Dil tasarımcıları için 'GGroup :: Inner' gibi bir şey yoktu çünkü belirsiz olurdu. Şunu düşünün: Eğer void doSomething (const GGroup & group1, const GGroup & group2) 'niz varsa,' template void doSomething (const Group1 & group1, const Group2 & group2) 'ile eşdeğerdir. Hangi GGroup' sonra başvuruyor? – ach

cevap

3

Kavramlar TS kısa formunun yerleşik olumsuz sadece bir kavramsallaştırılabilir parametrenin TypeName isim olamaz olmasıdır. Almak için decltype kullanmalısınız.

Yani bir fedakarlıkta vardır: Ya gerçek kodda decltype daha pahasına açık template beyanı önlemek edebilir veya açık bir şablon bildirimi pahasına decltype sahip önleyebilirsiniz.