2011-12-01 6 views

Odpowiedz

8

Nazywa się to Curiously Recurring Template Pattern lub CRTP w skrócie. Służy do uzyskania efektu statycznego polimorfizmu, wykorzystując fakt, że do czasu uzyskania numeru MyTemplate<MyClass> w linii class MyClass : public MyTemplate<MyClass>, jest on częściowo zdefiniowany (jest to typ niekompletny), więc można przechowywać wskaźniki do tego typu, itp. i robić z nim rzeczy, które nie wymagają pełnego typu.

+0

Nie powiedziałbym, że 'MyClass' jest niekompletna. Może się zdarzyć, że chcesz zapewnić ogólną funkcjonalność tej klasy. Na przykład [Przykład] (http://drdobbs.com/cpp/184403484). –

+1

@ R.K w punkcie 'public MyTemplate ', 'MyClass' jest rzeczywiście niekompletnym typem. Oznacza to, że możesz przechowywać wskaźniki i odniesienia itp. –

+0

Tak, masz rację. Teraz, gdy ponownie przeczytałem twój opis, jest to poprawne. Myślałem, że masz na myśli, że MyClass jest na przykład niekompletnym typem. –

2

Proszę wyjaśnić, jak to działa?

Uhm ... to po prostu robi? Standardowo pozwala na to, aby parametry szablonu były typu niekompletnego. A ponieważ żadna metoda w klasie bazowej CRTP nie wymaga w pełni zdefiniowanego typu, wszystko jest w porządku.

§3.9.2 P3 [basic.compound]
Wskaźniki niepełnych typów są dozwolone, choć istnieją ograniczenia dotyczące tego, co można zrobić z nich (3.11).

§14.3.1 p2 [temp.arg.type]
[Uwaga: Argument typu szablonu może być niekompletny (3.9). -end note]

2

To się nazywa CRTP. Służy do statycznego polimorfizmu, który może być szybszy niż użycie wirtualnego.

: public MyTemplate<MyClass> 

instancję MyTemplate<MyClass>, chociaż od MojaKlasa jest niekompletna można używać tylko T w sposób, który nie wymaga kompletnego typu. Takich jak użycie wskaźnika lub wywołanie funkcji składowej.

Zresztą wystarczy spojrzeć na fragmencie, to jest w zasadzie taki sam, jak ten:

class MyClass 
{ 
    MyClass* member; 
    MyClass* method(); 
} 

który jest w pełni legalny i zrozumiałe.

Powiązane problemy