2016-05-08 48 views
1

在此代碼:使用類本地類型別名在模板基類列表

template <typename Pair> 
struct EdgeRange : 
    public std::pair<decltype(valueIter(std::declval<Pair>().first)), 
        decltype(valueIter(std::declval<Pair>().second))> { 
    using EntryFirst = decltype(valueIter(std::declval<Pair>().first)); 
    using EntrySecond = decltype(valueIter(std::declval<Pair>().second)); 

    EdgeRange(const Pair& p): 
    std::pair<EntryFirst, EntrySecond>(valueIter(p.first), valueIter(p.second)) 
    {} 
}; 

decltype類型提到的每個兩次。如何在不將類型移到課堂外的情況下消除這種重複?

回答

4

std::pair具有類型定義爲它的兩種類型,所以你可以只利用那些:

template <typename Pair> 
struct EdgeRange : 
    public std::pair<decltype(valueIter(std::declval<Pair>().first)), 
        decltype(valueIter(std::declval<Pair>().second))> 
{ 
    using EntryFirst = typename EdgeRange::first_type; 
    using EntrySecond = typename EdgeRange::second_type; 

    // ... 
}; 
+0

......併爲構造函數類似,您可以用'EdgeRange ::對(...)'而不是命名這兩個成員類型,如果這是定義這兩個typedef的唯一目的。 –

+0

有趣。我想知道爲什麼'std :: pair(...)'在這種情況下不起作用? –