2016-11-28 974 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