2013-08-16 20 views
6

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

+0

strona 16ff http://accu.org/var/uploads/journals/Overload116.pdf zawiera artykuł o dynamicznym C++ za pomocą typu erasure – doctorlove

+0

Czytam teraz. Dzięki za sugestie. –

+0

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'. –

Odpowiedz

17

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.

+1

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 –

+2

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