Trik Barton – Nackman - Barton–Nackman trick
Trik Barton – Nackman je termín vytvořený normalizační komisí C ++ (ISO / IEC JTC1 / SC22 WG21) odkazovat na idiom představili John Barton a Lee Nackman as Omezené rozšiřování šablon.[1]
Idiom
Idiom se vyznačuje třídou funkce přítele definice, která se objevuje v komponentě šablony základní třídy v podivně se opakující vzor šablony (CRTP).
// Šablona třídy k vyjádření rozhraní pro porovnání rovnosti.šablona<typename T> třída rovný_srovnatelný { příteli bool operátor==(T konst &A, T konst &b) { vrátit se A.rovná(b); } příteli bool operátor!=(T konst &A, T konst &b) { vrátit se !A.rovná(b); }}; // Třída value_type chce mít == a! =, Takže pochází z // rovná_komparovatelná sama se sebou jako argument (což je CRTP).třída typ hodnoty : soukromé rovný_srovnatelný<typ hodnoty> { veřejnost: bool rovná(typ hodnoty konst& rhs) konst; // být definován};
Když se šablona třídy líbí rovný_srovnatelný
je vytvořena instance, vytvoří se definice přátel ve třídě bez šablony (a nečlenské) funkce (v tomto případě funkce operátora). V době, kdy byl zaveden idiom (1994), jazyk C ++ nedefinoval částečné řazení pro přetížené šablony funkcí a v důsledku toho přetížení šablony funkcí často vedlo k nejednoznačnostem. Například se snaží zachytit obecnou definici pro operátor ==
tak jako
šablona<typename T>bool operátor==(T konst &A, T konst &b) { /* ... */}
by byl v zásadě neslučitelný s jinou definicí jako
šablona<typename T>bool operátor==(Pole<T> konst &A, Pole<T> konst &b) { /* ... */}
Trik Barton – Nackman tedy dosahuje cíle poskytnout obecný uživatelsky definovaný operátor rovnosti, aniž by se musel vypořádat s takovými nejasnostmi. Přídavné jméno omezený v názvu idiomu odkazuje na skutečnost, že poskytovaná definice funkce ve třídě je omezena (platí pouze) na specializace dané šablony třídy.
Termín se někdy mylně používá k označení Zvědavě se opakující vzor šablony (CRTP). Jak je vysvětleno výše, trik Barton – Nackman je výrazný idiom (který se opírá o CRTP).
Jak to funguje
Když překladač narazí na výraz
v1 == v2
kde v1
a v2
jsou typu typ hodnoty
, pokouší se vyhledávání závislé na argumentech (ADL) pro operátor ==
. Toto vyhledávání zahrnuje zvážení funkcí přátel deklarovaných v typ hodnoty
a jeho základní třídy. (Všimněte si, že pokud typ hodnoty
byly neúplnou instancí šablony, ADL by spustil její úplné vytvoření instance.)
Trik Barton – Nackman se původně nespoléhal na ADL, ale na funkci C ++ nazvanou „friend name injection“, ve které deklarace funkce friend ve své třídě zviditelnila název funkce v bezprostředně obklopujícím rozsahu oboru názvů (možná v globálním rozsahu). . Při zkoumání možnosti odebrání injekce jména přítele z programovacího jazyka C ++ bylo shledáno, že jediným rozumným použitím pravidla tohoto jazyka je idiom Bartona a Nackmana. Nakonec byla upravena pravidla pro vyhledávání závislé na argumentech[2] nahradit injekci jména přítele méně drastickým mechanismem popsaným výše, který udržoval platnost techniky Bartona a Nackmana. Stojí za zmínku, že v důsledku této změny je výraz
:: operator == (v1, v2)
již není platný, protože kvalifikovaná jména nepodléhají ADL a prohlášení přátel se nenacházejí prostřednictvím běžného vyhledávání. To znamená, že příteli
specifikátor je zásadní, i když definované funkce přítele ve skutečnosti nepotřebují přístup k neveřejným členům třídy spřátelení.
Viz také
Reference
- ^ Barton, John J .; Nackman, Lee R. (1994). Scientific and Engineering C ++: An Introduction with Advanced Techniques and examples. Addison-Wesley. ISBN 0-201-53393-6.
- ^ „Alternativa k vkládání jmen ze šablon“ (PDF). 26. září 1995. Citováno 12. dubna 2005.
Další čtení
- Vandevoorde, David; Josuttis, Nicolai M .; Gregor, Douglas (2017). Šablony C ++: Kompletní průvodce (2. vyd.). Addison-Wesley. ISBN 978-0-321-71412-1.