Tour de Barton-Nackman
Le tour de Barton-Nackman de est une limite inventée par le comité d'étalonnage de C++ (OIN /CEI JTC1 SC22 WG21 de ) pour mentionner un idiome présenté par John Barton et Lee Nackman en tant qu'expansion de calibre limitée par .
L'idiome
L'idiome est caractérisé par une définition de fonction d'ami de dans-classe apparaissant dans le composant de calibre de classe basse du modèle curieusement périodique (CRTP) de calibre de .
lang=" de value_type de classe Le value_type de classe de // veut avoir le == et ! =, ainsi lui dérive de // equal_comparable avec lui-même comme argument (qui est le CRTP). : equal_comparable
Quand un calibre de classe comme equal_comparable est instancié, les définitions d'ami de dans-classe produisent des fonctions de nontemplate (et non élément de circuit) (fonctions d'opérateur dans ce cas-ci). Lorsque l'idiome a été présenté (1994) la langue de C++ n'a pas défini une commande partielle pour les calibres surchargés de fonction et en conséquence la surcharge des calibres de fonction a souvent eu comme conséquence les ambiguïtés. Par exemple, essai de capturer une définition générique pour operator== As
lang=" de
être essentiellement incompatible avec une autre définition comme
lang=" de
Le tour de Barton-Nackman, alors, atteint le but de fournir un opérateur d'égalité défini pour l'utilisateur générique sans devoir traiter de telles ambiguïtés. L'adjectif limité par dans le nom d'idiome se rapporte au fait que la définition de fonction fournie de dans-classe est limitée (s'applique seulement) aux spécialisations du calibre donné de classe.
Le terme est parfois de manière erronée employé pour se rapporter au modèle curieusement périodique (CRTP) de calibre de . Comme expliqué ci-dessus, le tour de Barton-Nackman est un idiome distinct (qui se fonde sur le CRTP).
Comment cela fonctionne
Quand le compilateur rencontre l'expressionv1 == v2
là où v1 et v2 sont du type value_type, il essaye la consultation dépendante (ADL) d'argument de pour operator==. Cette consultation inclut la considération des fonctions d'ami avouées dans value_type et ses classes basses. (Note qui si value_type étaient un exemple inachevé de calibre, ADL déclencherait son instanciation complète.)
Le tour de Barton-Nackman s'est à l'origine fondé pas sur l'ADL mais à a (maintenant désuet) C++ le dispositif a fait appel le " ; injection" nommé d'ami ; , dans lequel une déclaration de dans-classe d'une fonction d'ami a rendu le nom de fonction évident dans la portée immédiatement environnante de namespace (probablement la portée globale). En étudiant la possibilité d'enlever l'injection nommée d'ami du langage de programmation de C++, l'idiome de Barton et de Nackman s'est avéré la seule utilisation raisonnable de cette règle de langue. Par la suite, les règles pour la consultation argument-dépendante ont été ajustées pour remplacer l'injection nommée d'ami par un mécanisme moins énergique, décrit ci-dessus, qui a maintenu la validité de la technique de Barton et de Nackman. Il vaut de noter que, par suite de ce changement, l'expression
: : operator== (v1, v2)
n'est plus valide, parce que les noms qualifiés ne sont pas sujets à l'ADL et des déclarations d'ami ne sont pas trouvés par l'intermédiaire de la consultation ordinaire. Noter que ceci implique que le spécificateur de friend est essentiel, même si les fonctions définies d'ami n'ont pas besoin réellement d'accéder aux membres non publics de la classe traitante en ami.
| Random links: | Machine de SECD | HMS courageux (L10) | Dorothea de Saxe-Lauenburg | Unstrut | Nouveau sang | Truco_de_Barton-Nackman |