Czytam o boost type erasure
i staram się wymyślić potencjalne użycie. Chciałbym to trochę ćwiczyć, gdy czytam masę dokumentacji na ten temat (wygląda na duży). Najczęściej cytowany obszar aplikacji, który jest sieci/wymiany danych między klientem a serwerem. Czy możesz zaproponować inny przykład lub ćwiczenie, w którym mogę zagrać w tej bibliotece?Praktyka i odkrycie typu Erostu wzmocnienia
Odpowiedz
Typ Erasure jest przydatny w nadzwyczajnych sytuacjach, do punktu, w którym może być uważany za zasadniczo brakującą cechę językową, która łączy ogólne i obiektowe style programowania.
Kiedy definiujemy klasę w C++, to, co tak naprawdę definiujemy, jest bardzo specyficznym type
i bardzo specyficznym interface
, i że te dwie rzeczy niekoniecznie muszą być powiązane. A type
zajmuje się danymi, gdzie jako interface
zajmuje się przekształceniami na tych danych. Ogólny kod, taki jak w STL, nie dba o type
, dba o interface
: możesz sortować dowolny kontener lub sekwencję podobną do kontenera przy użyciu std::sort
, o ile zapewnia porównanie i iterator interface
.
Niestety, ogólny kod w C++ wymaga polimorfizmu czasu kompilacji: templates
. Nie pomaga to w przypadku rzeczy, których nie można poznać przed uruchomieniem, lub rzeczy, które wymagają jednolitego interfejsu.
Prosty przykład: w jaki sposób przechowujesz wiele różnych typów w jednym pojemniku? Najprostszym mechanizmem będzie przechowywanie wszystkich typów w pustce *, być może z pewnymi informacjami o typie, aby je rozróżnić. Innym sposobem jest rozpoznanie wszystkich tych types
mających takie samo pobranie. Jeśli moglibyśmy stworzyć pojedynczy interfejs dla retrieval
, a następnie specjalizować go dla każdego typu, to tak jakby część type
została usunięta.
any_iterator
to kolejna bardzo przydatna powód, aby to zrobić: jeśli trzeba iteracyjne nad pewną liczbę różnych pojemników z tego samego interfejsu, trzeba będzie usunąć type
pojemnika z type
z iteracyjnej. boost :: any_range jest subtelnym ulepszeniem tego, rozszerzając go z iteratorów na zakresy, ale podstawowa idea jest taka sama.
Krótko mówiąc, za każdym razem trzeba iść z wielu types
z podobnym interface
do jednego type
z jednym interface
, trzeba będzie jakąś formę typu skasowaniem. Jest to technika wykonywania, która zrównuje szablony czasu kompilacji.
Witam. W międzyczasie, dla odniesienia, przeczytałem także od Thomasa Beckera: http://www.artima.com/cppsource/type_erasure.html http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html –
Obie doskonałe zasoby, ale myślałem, że możesz chcieć wiedzieć o znacznie bardziej ogólnej potrzebie wymazywania typów, poza 'any' lub' any_iterator' lub 'any_container'. Podobnie jak wskaźniki funkcji członków istnieją tylko w celu implementacji delegatów, może się zdarzyć, że funkcje wirtualne istnieją przede wszystkim w celu umożliwienia wymazywania typów. To podstawa koncepcji. – Alice
strona 16ff http://accu.org/var/uploads/journals/Overload116.pdf zawiera artykuł o dynamicznym C++ za pomocą typu erasure – doctorlove
Czytam teraz. Dzięki za sugestie. –
Powiedziałbym, że dla sieci, klasyczny polimorfizm runtime jest bardziej odpowiedni idiom niż typ wymazania. Typ erasure jest świetny do obsługi deleterów i alokatorów w 'std :: shared_ptr'. –