0
template<size_t bits_count, typename = void> 
struct best_type { 
}; 

template<size_t bits_count> 
struct best_type<bits_count,enable_if_t<bits_count > 8>> { // error: template argument 2 is invalid 
    typedef byte type; 
}; 

錯誤是因爲解析器在隨機8之後看到第二個模板參數爲enable_if_t<bits_count >這個條件如何被放入模板部分專業化?

很明顯,解決方案可以將enable_if_t的參數替換爲bits_count >= 9,但是可以做些事情來保留原始表達式,這樣對未來的讀者會有意義嗎?

回答

4

您應該添加額外的括號解釋編譯你的意思:

template<size_t bits_count> 
struct best_type<bits_count,enable_if_t<(bits_count > 8)>> { 
    typedef byte type; 
}; 
1

放在括號中的條件。

template<size_t bits_count, typename = std::enable_if_t<true>> 
struct best_type { 
}; 

template<size_t bits_count> 
struct best_type<bits_count, std::enable_if_t<(bits_count > 8)>> { 
    using type = byte; 
}; 

另外請注意,我已經取代了voidstd::enable_if_t<true>,因爲它更有意義給讀者。

還要注意,最好是在C使用using別名(相對於typedef S)++

+0

'void'是明確的。命名參數'Enabler'或'AlwaysVoid'會使模式更清晰。 – Jarod42