GOOGLE ADS

mercredi 13 avril 2022

Pourquoi n'est-il pas permis à une spécialisation partielle dans un argument non-type d'utiliser des paramètres de modèle imbriqués

j'ai ce code

template<int N, bool C = true>
struct A;
template<int N>
struct A<N,!(N % 5)> {
/*... */
};
// should work
A<25> a;

Autrement dit, pour les nombres Ndivisibles par 5, le compilateur doit utiliser la spécialisation partielle. Mais le compilateur n'acceptera pas cette spécialisation partielle, car la norme l'oblige à rejeter un tel code où un argument non-type d'une spécialisation partielle fait référence à un paramètre et n'est pas simplement un paramètre (comme, A<N, N>serait valide). Mais quelle est la raison de le faire?

Notez que je peux simplement changer mon code en un exemple plus verbeux et il est valide

template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;
template<int N>
struct A<N, wrap<!(N % 5)> > {
/*... */
};
// should work
A<25> a;

C'est bien parce que ce n'est plus un paramètre non-type. Mais quelle est la raison pour laquelle la spécification interdit la spécialisation partielle plus simple ?


Solution du problème

Je pense que c'est en grande partie historique. Les paramètres de modèle non typés n'étaient pas du tout autorisés à l'origine. Quand ils ont été ajoutés, il y avait beaucoup de limitations. Au fur et à mesure que les gens essayaient différentes possibilités et confirmaient qu'elles ne causaient pas de problèmes, certaines limitations ont été supprimées.

Certaines de ces limitations originales restent sans raison particulière au-delà du fait que personne n'a pris la peine de travailler à les changer. Tout comme là-bas, beaucoup d'entre eux peuvent être contournés, de sorte que les supprimer ne causerait généralement pas de difficulté particulière. La plupart du temps, il s'agit de savoir si quelqu'un s'intéresse suffisamment à ce cas particulier pour écrire un article à ce sujet.

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...