Klasy parametryzowane wytycznymi w C++
Klasy parametryzowane wytycznymi to technika metaprogramowania w C++, opisana przez Andrei Alexandrescu. Pozwala ona na uzyskanie większej elastyczności w projektowaniu klas, poprzez łączenie ich z innymi klasami, zwanymi wytycznymi. Te wytyczne działają jak wtyczki, które umożliwiają użytkownikowi dostosowywanie klas bez konieczności tworzenia wielu wariantów kodu.
W przeciwieństwie do wzorca projektowego Strategia, który pozwala na dynamiczną zmianę zachowania obiektów w czasie działania programu, wytyczne ustalają zachowanie klas podczas kompilacji.
Przykład zastosowania
Rozważmy przykład klasy inteligentnego wskaźnika, gdzie użytkownik ma możliwość wyboru, czy przeprowadzać testowanie poprawności. Zamiast dodawania parametru do konstruktora, co generowałoby nadmiarowy kod, możemy wprowadzić wytyczne dotyczące obsługi błędów.
Standardowa klasa SmartPtr może być zdefiniowana następująco:
template
class SmartPtr {
// ...
};
Aby dodać wytyczne, rozszerzamy klasę SmartPtr o parametr szablonu dotyczący obsługi błędów:
template
class SmartPtr : public ErrorHandling {
// ...
};
W ten sposób klasa SmartPtr dziedziczy metody z klasy ErrorHandling, co umożliwia różne podejścia do sprawdzania poprawności. Przykładowe klasy ErrorHandling to:
- NoChecking: Brak sprawdzania poprawności wskaźnika.
- StrictChecking: Sprawdza, czy wskaźnik jest nullem przed jego użyciem.
Przykład użycia:
SmartPtr> ptrNoCheck = new Foo();
ptrNoCheck.Get()->Bar(); // Get() nie sprawdzane
SmartPtr> ptrChecked = new Foo();
ptrChecked.Get()->Bar(); // Get() sprawdzane
Dzięki wytycznym można również łatwo dodać wsparcie dla funkcji, takich jak wielowątkowość czy liczenie referencji, pozostawiając użytkownikowi możliwość wyboru strategii zachowania.
Podsumowanie
Wytyczne to potężne narzędzie dla twórców bibliotek i silników, umożliwiające elastyczne, efektywne i bezpieczne typologicznie rozszerzanie kodu przez użytkowników.