Named template parameters

Podobne dokumenty
Zaawansowane programowanie w C++ (PCP)

Szablony funkcji i szablony klas

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Curiously recurring template pattern

Programowanie MorphX Ax

Wprowadzenie do szablonów klas

Spis treści. Wprowadzenie 15

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Refleksja oraz metaklasy w C++ W dążeniu do prostszego oraz efektywniejszego kodu w C++

Szablony funkcji i klas (templates)

external Data Representation

Zakres egzaminu dyplomowego (magisterskiego) na kierunku INFORMATYKA

Szablony. Szablony funkcji

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

KARTA KURSU. Programowanie obiektowe

MySQL. Æwiczenia praktyczne

Wykład 8: klasy cz. 4

Wykład I. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Programowanie generyczne w C++

Szablony klas, zastosowanie szablonów w programach

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

6. Algorytmy ochrony przed zagłodzeniem dla systemów Linux i Windows NT.

Multimedia JAVA. Historia

Algorytmy i Struktury Danych. Anna Paszyńska

Standard C++0x (C++1x?) Marcin Świderski

Style programowania - krótki przeglad

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Paradygmaty programowania

Import danych z plików Excel. (pracownicy, limity urlopowe i inne)

C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska

Praca w środowisku Visual Studio 2008, Visual C

I. Interfejs użytkownika.

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Wielojęzykowość w aplikacjach J2EE. Tomasz.Skutnik@e-point.pl

1 Atrybuty i metody klasowe

Co zawiera ten dokument: Ten dokument zawiera informacje o sposobie organizacji danych w systemie Kancelaris.

Abstrakcyjny typ danych

Signals + Threads: Qt vs. Boost

Projektowanie klas c.d. Projektowanie klas przykład

Bezpieczeństwo systemów informatycznych

Serwer WWW Apache. Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, , zakończony projekt

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Zaawansowane programowanie w C++ (PCP)

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie 2. Język C++. Wykład 3.

Wartości domyślne, szablony funkcji i klas

Programowanie Komponentowe WebAPI

DOKUMENTY. v Strona 1 z 10

Plan. Wprowadzenie. Co to jest APEX? Wprowadzenie. Administracja obszarem roboczym

Programowanie w Ruby

Sun RPC/XDR 10. listopada Dariusz Wawrzyniak (IIPP) 1

Relacyjne, a obiektowe bazy danych. Bazy rozproszone

Instrukcja użytkownika. Panel Administratora CreamCRM

Zadania semestralne. Programowanie obiektowe sem. II, lato 2014/2015

Paweł Cieśla. Dokumentacja projektu

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Praca Magisterska "System zdalnego składania ofert kupna i sprzedaży za pośrednictwem Internetu" AUTOR PROMOTOR

sprowadza się od razu kilka stron!

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Zaawansowane programowanie w C++ (PCP)

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe. Wykład 5. C++: szablony

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Diagramy klas. dr Jarosław Skaruz

Database Connectivity

Programowanie Komputerów

Struktury. Przykład W8_1

Programowanie w Ruby

Style programowania - krótki przeglad

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Rozproszone systemy internetowe. Wprowadzenie. Koncepcja zdalnego wywołania procedury

Instrukcja laboratoryjna cz.3

Język C++ wykład VIII

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Microsoft Interface Definition Language

Java jako język programowania

PROGRAMOWANIE w C prolog

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

WYDAWANIE CZYTNIKAMI BY CTI Instrukcja

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Sun RPC/XDR. Dariusz Wawrzyniak 1

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Common Lisp - funkcje i zmienne

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C

Transkrypt:

Warsaw C++ User Group 12 listopada 2013

Gemius Krótko o projektach w firmie.

Gemius Produkty: gemiusaudience gemiusprism gemiustraffic gemiusdirecteffect gemiusheatmap gemiusstream gemiusshopmonitor

Gemius Projekty niskopoziomowe: MooseFS rozproszony system plików Taskell system do rozpraszania zadań i kontroli zasobów VSender główna baza danych

VSender zbierane są odsłony...dużo odsłon, 12 miliardów dziennie pliki dobowe powyżej 200G...po kompresji 1:40 jedna odsłona zajmuje kilkanaście bajtów dane są sortowane, składowane i serwowane z małym opóźnieniem system korzysta z MooseFS i Taskell

CommonLib logowanie zdarzeń obsługa puli wątków system wyjątków interfejs MySQL interfejs SQLite serwis geolokalizacji serwis stref czasowych narzędzia systemowe RTL - format plików naszych baz danych

RTL paradygmat const database pliki systemu VSender są w tym formacie wykorzystywana biblioteka boost zawiera algorytmy kompresji, serializacji, format pliku: dane podzielone na bloki rekordy zgodnie z zadanym kluczem indeks po kluczu głównym CreateClass - zestaw makr ułatwiający definicję rekordu

RTL/CreateClass Definicja rekordu: CREATE_CLASS( MyRecord, ((ID) (uint64_t) (DEFAULT)) ((TS) (int32_t) (DEFAULT)) ((Name) (std::string) (DEFAULT)), ) PRINTABLE DEFAULTCONSTRUCTIBLE

Konfiguracja bazy przez parametry szablonu: template < typename RecordType, typename KeyFunctor, template <class> class Codec, typename EquivJoinPolicy, typename Defaults, typename IndexType, typename BlockFlushPolicy, typename SorterBufferPolicy, bool Stable > class DatabaseConfig;

Analogiczny przykład z języka Python: subprocess.check_call( args, *, stdin=none, stdout=none, stderr=none, shell=false)

Wiele opcji, a można: subprocess.check_call( [ seq, 1, 5 ], stdout=open( output.txt, w ))

Jak coś takiego zrobić ogólnie dla funkcji w C++? przeciążanie operator= przeciążanie operator, foo(( a=5, b=10)); foo(const Opts& = Opts()); trudniejsze ze względu na referencje można użyć boost.parameter

W przypadku szablonów: zbliżone do programowania funkcyjnego i dzięki temu łatwiejsze

Istnieje rozwiązanie książkowe: C++ Templates: The Complete Guide David Vandevoorde, Nicolai M. Josuttis oparte o dziedziczenie wirtualne dziedziczenie po klasie Defaults

Rozwiązanie ma pewne wady: nie można dziedziczyć (public) po tej samej klasie sporo nadmiarowych klas utrata kontroli przez mechanizm dziedziczenia u nas nie wszystkie cechy to typename/typedef część parametrów jest od siebie zależna

Zastosowane rozwiązanie nieksiążkowe: oparte o proste mechanizmy języka na podstawie listy typów szybko się kompiluje :)

lista typów template <typename Param, typename Tail> struct ParamList { }; struct ParamEOList { }; pusty parametr struct NopParam { };

DatabaseConfig: RecordType i KeyFunctor - bez zmian kolejne Param0, Param1, itd. - jako zwykłe typename domyślnie NopParam nawlekamy na listę (w odwrotnej kolejności):...... ParamList<Param2, ParamList<Param1, ParamList<Param0, ParamEOList> > >

Kod można wygenerować, wykorzystamy boost.preprocessor: #define CONFIG_PARAMS_COUNT 10 #define CONFIG_TEMPLATE_PARAMS... #define CONFIG_PARAMS_LIST...

Generowanie parametrów szablonu: #define CONFIG_MAKE_PARAM(Z, I, Data) \ BOOST_PP_COMMA_IF(I) typename Param ## I = NopParam #define CONFIG_TEMPLATE_PARAMS \ BOOST_PP_REPEAT(CONFIG_PARAMS_COUNT, CONFIG_MAKE_PARAM, _)

Generowanie listy parametrów: #define CONFIG_PARAMS_NODE_LHS(Z, I, Data) \ ParamList<BOOST_PP_CAT(Param, \ BOOST_PP_SUB(BOOST_PP_SUB(CONFIG_PARAMS_COUNT, I), 1)), #define CONFIG_PARAMS_NODE_RHS(Z, I, Data) > #define CONFIG_PARAMS_LIST \ BOOST_PP_REPEAT(CONFIG_PARAMS_COUNT, CONFIG_PARAMS_NODE_LHS, _) \ ParamEOList \ BOOST_PP_REPEAT(CONFIG_PARAMS_COUNT, CONFIG_PARAMS_NODE_RHS, _)

Każdy parametr ma swój sposób definiowania: struct UseFeature1 { }; struct UseFeature2 { }; template <typename Other> struct SetFeature { };

...i swój mechanizm wyciągania wartości: template <typename Params> struct ExtractFeature; Niech udostępnia np.: typedef feature type.

...i częściowe specjalizacje: a) trafiamy na nasz feature, np: template <typename Tail> struct ExtractFeature<ParamList<UseFeature1, Tail> > { typedef feature1 feature_type; };

...i częściowe specjalizacje: b) trafiamy na feature użytkownika: template <typename Other, typename Tail> struct ExtractFeature<ParamList<SetFeature<Other>, Tail> > { typedef Other feature_type; };

...i częściowe specjalizacje: c) ustawienie dla innej cechy: template <typename Param, typename Tail> struct ExtractFeature<ParamList<Param, Tail> > : ExtractFeature<Tail> { };

...i częściowe specjalizacje: d) ustawienie domyślne: template <> struct ExtractFeature<ParamEOList> { typedef default_type feature_type; };

Użycie w DatabaseConfig: template < typename RecordType, typename KeyFunctor, CONFIG_TEMPLATE_PARAMS > class DatabaseConfig { typedef CONFIG_PARAMS_LIST Params; typedef typename ExtractFeature<Params>::feature_type feature_type; /*... */

Przykład użycia.

Wcześniejszą konfigurację zapisywaliśmy: typedef DatabaseConfig< TestRecord, TestKeyFunctor, NetworkOrderCodec, JoinEquivalentWith<TestJoiner>, RecordDatabaseDefaults<3, 4096>, StandardFileIndex<TestKeyFunctor::result_type, NetworkOr StandardBlockFlushPolicy<TestRecord, TestKeyFunctor>, JoinEquivalentWith<TestJoiner>::record_sorter_buffer_pol true > TestConfig;

...a teraz tak: typedef DatabaseConfig< TestRecord, TestKeyFunctor, SetJoinPolicy<JoinEquivalentWith<TestJoiner> >, SetStable > TestConfig;

Pytania?

Dziękuję za uwagę.