2016-11-28 966 views
7

說我有一個概念:如何從概念中檢索類型?

template < typename Group > concept bool GGroup = 
    requires() { typename Group::Inner; }; 

在短期形式使用概念,而我怎麼能檢索類型Inner

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

如何使用長格式:'template void doSomething(const Group&group){... Group :: Inner ...}'? – ach

+0

@AndreyChernyakhovskiy是的,但重點是以較短的形式做到這一點。 – Vahagn

+4

然後你打敗你自己的目的。您不能使用簡短的表格(其中的一點是消除對實際類型的不必要的引用),並且同時參考實際類型。對於語言設計者來說,像GGroup :: Inner這樣的東西不是一種選擇,因爲它不明確。考慮:如果你有'void doSomething(const GGroup&group1,const GGroup&group2)',它就等於'template void doSomething(const Group1&group1,const Group2&group2)''。那麼'GGroup'會指哪一個? – ach

回答

3

Concepts TS的短形式的內置缺點是,您不能只命名概念化參數的類型名稱。你必須使用decltype才能得到它。

所以,你有一個折衷:你可以避開你的實際代碼具有更decltype費用明確template申報,也可以避免在明確的模板聲明的費用爲decltype