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; 
}; 

L'erreur est due à l'analyseur voit le deuxième argument de modèle comme enable_if_t<bits_count > suivant un 8 aléatoire.Comment cette condition peut-elle être mise en spécialisation partielle de modèle?

Évidemment la solution à ceci peut remplacer l'argument de enable_if_t à bits_count >= 9, mais peut-on faire quelque chose pour préserver l'expression originale ainsi elle aura du sens aux futurs lecteurs?

Répondre

4

Vous devez ajouter entre parenthèses supplémentaires pour expliquer le compilateur ce que vous entendez:

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

Mettez la condition entre parenthèses.

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; 
}; 

Notez également que je l'ai remplacé le void avec std::enable_if_t<true>, car il est plus logique au lecteur.

Notez également qu'il est préférable d'utiliser using alias (par rapport à typedef s) en C++

+0

'void' est clair. Nommer le paramètre 'Enabler' ou' AlwaysVoid' rendrait le motif plus clair. – Jarod42