Curiously recurring template pattern

Podobne dokumenty
Zaawansowane programowanie w C++ (PCP)

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Imię i nazwisko: PYTANIA I ODPOWIEDZI Nr 0 EGZAMIN Język C++ 27 czerwca 2011

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

obiekty funkcyjne - funktory

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Programowanie obiektowe i C++ dla matematyków

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Paradygmaty programowania. Paradygmaty programowania

Programowanie Obiektowe i C++

Zaawansowane programowanie w C++ (PCP)

Wprowadzenie do szablonów klas

Programowanie obiektowe

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

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

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe

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

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

Programowanie obiektowe w C++ Wykład 12

Algorytmy i Struktury Danych. Anna Paszyńska

1. Mamy definicje czterech klas: class A1 {public: A1() {cout<<"a1";}}; class A2 : private A1 {public: A2() {cout<<"a2";}}; class A3 {public: A3()

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Qt sygnały i designer

Szablony wyrażeń i Boost Spirit

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

.NET Klasy, obiekty. ciąg dalszy

Programowanie obiektowe

Signals + Threads: Qt vs. Boost

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

PROGRAMOWANIE GENERYCZNE W JĘZYKU C++

Named template parameters

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

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

Programowanie, część I

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Wstęp do Programowania 2

Programowanie obiektowe Wykład 7. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

class A { public: A(): i(5), s("abc") { } int i; string s; };

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Język C++ wykład VIII

Ściąga z JTP. (Ja Tjeba Pierd...) Uwagi, nowe pytania, poprawki itd. zgłaszać na forum mambo.

C++ 11: C++ 11: C++11: jednolita inicjalizacja. C++11: jednolita inicjalizacja. C++11: jednolita inicjalizacja. C++11: initializer_list

Wprowadzenie do szablonów szablony funkcji

Operatory na rzecz typu TString

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Visual C++/CLI. Języki Programowania na Platformie.NET (część 2) Tomasz Goluch. goluch/

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

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

Wprowadzenie do szablonów szablony funkcji

Platformy Programistyczne Podstawy języka Java

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Szablony funkcji i szablony klas

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

PROGRAMOWANIE NISKOPOZIOMOWE. Struktury w C. Przykład struktury PN.06. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

PARADYGMATY PROGRAMOWANIA Wykład 4

Zaawansowane programowanie w C++ (PCP)

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

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe w VB cz 2

string Rodzaj[4]= {"TV ", "wieza ", "DVD ", "kino "}; string Producent[4]={"Phillips", "Sony ", "Sanyo ", "Samsung "};

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

6 Niektóre nowe cechy standardu C++11

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Szablony klas, zastosowanie szablonów w programach

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Abstrakcyjny typ danych

Programowanie obiektowe C++

Wykład 5 Okna MDI i SDI, dziedziczenie

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Dziedziczenie. Ogólna postać dziedziczenia klas:

Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

Podstawy programowania. Programowanie obiektowe

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Szablony. Szablony funkcji

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie obiektowe

PROGRAMOWANIE NISKOPOZIOMOWE

Wstęp do programowania 1


Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Materiały. Języki programowania II (Java+AVR-GCC) Literatura

Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

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

Programowanie obiektowe w języku

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

1 Atrybuty i metody klasowe

Klasy abstrakcyjne i interfejsy

Identyfikacje typu na etapie. wykonania (RTTI)

TEMAT : KLASY DZIEDZICZENIE

Transkrypt:

class Derived : public Base<Derived> Adam Mizerski adam@mizerski.pl Warsaw C++ Users Group 13 stycznia 2015

Wstęp The Matasano Crypto Challenges The Matasano Crypto Challenges http://cryptopals.com/

Wstęp Convert hex to base64 The string: 49276d206b696c6c696e6720796f757220627261696e206c 696b65206120706f69736f6e6f7573206d757368726f6f6d Should produce: SSdtIGtpbGxpbmcgeW91ciBicmFpbiBs awtligegcg9pc29ub3vzig11c2hyb29t 0 Źródło: http://cryptopals.com/sets/1/challenges/1/

Czym jest base64? Czym jest base64?

Czym jest base64? Czym jest base64? Metoda kodowania danych binarnych w ASCII

Czym jest base64? Czym jest base64? Ciąg znaków z zakresu [A-Za-z0-9+/], 3 bajty to 4 znaki.

Czym jest base64? Tabela base64 0 Źródło: https://en.wikipedia.org/wiki/base64

Czym jest base64? Kodowanie base64 0 Źródło: https://en.wikipedia.org/wiki/base64

Czym jest base64? Przykład Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the shortvehemence of any carnal pleasure. TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dghlig1pbmqsihroyxqgynkgysbwzxjzzxzlcmfuy2ugb2ygzgvsawdodcbpbib0agugy29udglu dwvkigfuzcbpbmrlzmf0awdhymxligdlbmvyyxrpb24gb2yga25vd2xlzgdllcblegnlzwrzihro ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4= 0 Źródło: https://en.wikipedia.org/wiki/base64

Czym jest base64? Dopełnianie (padding) opcjonalne any carnal pleasure. YW55IGNhcm5hbCBwbGVhc3VyZS4= any carnal pleasure YW55IGNhcm5hbCBwbGVhc3VyZQ== any carnal pleasur YW55IGNhcm5hbCBwbGVhc3Vy any carnal pleasu YW55IGNhcm5hbCBwbGVhc3U= any carnal pleas YW55IGNhcm5hbCBwbGVhcw== 0 Źródło: https://en.wikipedia.org/wiki/base64

Projekt Czego wymagamy od klasy Base64String?

Projekt Tworzenie i przypisywanie z const char i std::string, Rzuca wyjątek, gdy dane wejściowe niepoprawne, Iteratory i operator[] tylko do odczytu.

Projekt Zarys implementacji Klasa Base64Char odpowiada za jeden znak,

Projekt Zarys implementacji Klasa Base64Char odpowiada za jeden znak, Klasa Base64String zawiera obiekty klasy Base64Char, odpowiada za cały ciąg.

Implementacja Base64Char Część trywialna. 1 class Base64Char { 2 char char_; 3 public: 4 Base64Char() = default; 5 Base64Char(const Base64Char&) = default; 6 Base64Char(Base64Char&&) = default; 7 Base64Char& operator=(const Base64Char&) = default; 8 Base64Char& operator=(base64char&&) = default; 9 operator char() const { return char_; }

Implementacja Base64Char Rzuca wyjątek, gdy dane wejściowe niepoprawne. 10 private: 11 friend class Base64String; 12 static void throw_if_illegal(char char_); 13 public: 14 Base64Char(char char ) : char_(char ) 15 { throw_if_illegal(char ); } 16 17 Base64Char& operator=(char char ) 18 { 19 throw_if_illegal(char ); // exception safety 20 char_ = char ; 21 return this; 22 }

Implementacja Base64Char Tylna furtka. 23 private: 24 friend class Base64String; // dla przypomnienia 25 static Base64Char create_unchecked(char char ) { 26 auto c = Base64Char{}; 27 c.char_ = char ; 28 return c; 29 } 30 };

Implementacja Base64String Część trywialna. 1 class Base64String { 2 private: 3 std::basic_string<base64char> value; 4 public: 5 Base64String() = default; 6 Base64String(const Base64String&) = default; 7 Base64String(Base64String&&) = default; 8 Base64String& operator=(const Base64String&) = default; 9 Base64String& operator=(base64string&&) = default;

Implementacja Base64String 10 private: 11 template <class Iterator> 12 static void throw_if_illegal(iterator first, Iterator last) {...} 13 public: 14 template <class Iterator> 15 SpecialString& assign(const Iterator first, const Iterator last) { 16 std::for_each(first, last, Base64Char::throw_if_illegal); 17 throw_if_illegal(first, last); 18 value.resize(std::distance(first, last), ); 19 std::transform(first, last, value.begin(), Base64Char::create_unchecked) 20 return this; 21 } Konstruktory i operatory przypisania z std::string i const char są już trywialne.

Czym jest hex? Czym jest hex? Metoda kodowania danych binarnych w ASCII.

Czym jest hex? Czym jest hex Ciąg znaków z zakresu [0-9a-f], Jeden znak to wartość z zakresu 0-15, czyli 4 bity, Dwa znaki to jeden bajt.

Projekt Czego wymagamy od klasy HexString?

Projekt string Tworzenie i przypisywanie z const char i std::string Rzuca wyjątek, gdy dane wejściowe niepoprawne Iteratory i operator[] tylko do odczytu

Projekt Zarys implementacji Klasa HexChar odpowiada za jeden znak,

Projekt Zarys implementacji Klasa HexChar odpowiada za jeden znak, Klasa HexString zawiera obiekty klasy HexChar, odpowiada za cały ciąg.

Projekt Wymagania Wygląda znajomo?

Implementacja Implementacja Mając gotową implementację Base64Char i Base64String... for i in {char,string}.{c,h}pp; do cp base64${i} hex${i} done sed -i s/base64/hex/g hex* Edycja HexChar::throw_if_illegal i HexString::throw_if_illegal.

Wyciągamy część wspólną DRY principle

Wyciągamy część wspólną DRY principle (don t repeat yourself)

Wyciągamy część wspólną DRY principle (don t repeat yourself) Wyciągamy część wspólną

Wyciągamy część wspólną Różnice między Base64 a Hex {Base64,Hex}Char::throw_if_illegal {Base64,Hex}String::throw_if_illegal

Wyciągamy część wspólną Różnice między Base64 a Hex {Base64,Hex}Char::throw_if_illegal {Base64,Hex}String::throw_if_illegal virtual?

Wyciągamy część wspólną Różnice między Base64 a Hex {Base64,Hex}Char::throw_if_illegal {Base64,Hex}String::throw_if_illegal virtual? with static???

Wyciągamy część wspólną Metody wirtualne 1 struct Base { 2 virtual void bar() = 0; 3 void foo() { bar(); } 4 }; 5 struct Derived1 : Base { 6 virtual void bar() override; 7 }; 8 struct Derived2 : Base { 9 virtual void bar() override; 10 }; Każda klasa dziedziczy po tej samej klasie Base. Wywoływanie metod przez vtable.

Wyciągamy część wspólną CRTP CRTP

Wyciągamy część wspólną CRTP CRTP Klasa dziedzicząca jako parametr szablonu klasy bazowej. class Derived : Base<Derived>

Wyciągamy część wspólną CRTP Inaczej mówiąc dajemy klasie bazowej dostęp do dziedziczącej.

Wyciągamy część wspólną CRTP 1 template <typename InheritingType> 2 struct Base { 3 void foo() { InheritingType::bar(); } 4 }; 5 struct Derived1 : Base<Derived1> { 6 void bar(); 7 }; 8 struct Derived2 : Base<Derived2> { 9 void bar(); 10 }; Każda klasa dziedziczy po osobnej klasie Base<Derived>. Pozwala na bezpośrednie wołanie metod klasy dziedziczącej (łącznie ze statycznymi).

Implementacja SpecialChar Część trywialna. 1 template <class InheritingType> 2 class SpecialChar { 3 char char_; 4 public: 5 SpecialChar() = default; 6 SpecialChar(const SpecialChar&) = default; 7 SpecialChar(SpecialChar&&) = default; 8 SpecialChar& operator=(const SpecialChar&) = default; 9 SpecialChar& operator=(specialchar&&) = default; 10 operator char() const { return char_; }

Implementacja SpecialChar Rzuca wyjątek, gdy dane wejściowe niepoprawne. 11 public: 12 SpecialChar(char char ) : char_(char ) 13 { InheritingType::throw_if_illegal(char ); } 14 15 SpecialChar& operator=(char char ) 16 { 17 InheritingType::throw_if_illegal(char ); 18 char_ = char ; 19 return this; 20 }

Implementacja SpecialChar Tylna furtka. 21 private: 22 static InheritingType create_unchecked(char char ) { 23 auto c = InheritingType{}; 24 c.char_ = char ; 25 return c; 26 } 27 };

Implementacja Base64Char 1 class Base64Char : public SpecialChar<Base64Char> { 2 private: 3 typedef SpecialChar<Base64Char> BaseType; 4 friend BaseType; 5 6 friend SpecialString<Base64String, Base64Char>; 7 8 static void throw_if_illegal(const char char_); 9 public: 10 using BaseType::BaseType; 11 };

Implementacja SpecialString Część trywialna. 1 template <class InheritingType, class SpecialCharType> 2 class SpecialString { 3 private: 4 std::basic_string<specialchartype> value; 5 public: 6 SpecialString() = default; 7 SpecialString(const SpecialString&) = default; 8 SpecialString(SpecialString&&) = default; 9 SpecialString& operator=(const SpecialString&) = default; 10 SpecialString& operator=(specialstring&&) = default;

Implementacja SpecialString 11 public: 12 template <class Iterator> 13 SpecialString& assign(const Iterator first, const Iterator last) { 14 std::for_each(first, last, SpecialCharType::throw_if_illegal); 15 InheritingType::throw_if_illegal(first, last); 16 value.resize(std::distance(first, last), ); 17 std::transform(first, last, value.begin(), 18 SpecialCharType::create_unchecked); 19 return this; 20 }

Implementacja Base64String 1 class Base64String : public SpecialString<Base64String, Base64Char> { 2 private: 3 typedef SpecialString<Base64String, Base64Char> BaseType; 4 friend BaseType; 5 6 template <Iterator> 7 static void throw_if_illegal(iterator first, Iterator last) {...} 8 public: 9 using BaseType::BaseType; 10 };

Implementacja HexChar i HexString HexChar i HexString analogicznie.

Podsumowanie Podsumowanie 1 struct Base { 2 virtual void bar() = 0; 3 void foo() { bar(); } 4 }; 5 struct Derived1 : Base { 6 virtual void bar() override; 7 }; 8 struct Derived2 : Base { 9 virtual void bar() override; 10 }; 1 template <typename InheritingType> 2 struct Base { 3 void foo() { InheritingType::bar(); } 4 }; 5 struct Derived1 : Base<Derived1> { 6 void bar(); 7 }; 8 struct Derived2 : Base<Derived2> { 9 void bar(); 10 };

Podsumowanie Podsumowanie 1 struct Base { 2 virtual void bar() = 0; 3 void foo() { bar(); } 4 }; 5 struct Derived1 : Base { 6 virtual void bar() override; 7 }; 8 struct Derived2 : Base { 9 virtual void bar() override; 10 }; 1 template <typename InheritingType> 2 struct Base { 3 void foo() { InheritingType::bar(); } 4 }; 5 struct Derived1 : Base<Derived1> { 6 void bar(); 7 }; 8 struct Derived2 : Base<Derived2> { 9 void bar(); 10 }; https://github.com/etam/etam_string_types

Podsumowanie Podsumowanie 1 struct Base { 2 virtual void bar() = 0; 3 void foo() { bar(); } 4 }; 5 struct Derived1 : Base { 6 virtual void bar() override; 7 }; 8 struct Derived2 : Base { 9 virtual void bar() override; 10 }; 1 template <typename InheritingType> 2 struct Base { 3 void foo() { InheritingType::bar(); } 4 }; 5 struct Derived1 : Base<Derived1> { 6 void bar(); 7 }; 8 struct Derived2 : Base<Derived2> { 9 void bar(); 10 }; https://github.com/etam/etam_string_types Pytania?