latajacaryba Temat założony przez niniejszego użytkownika |
Template - Przydatność szablonów klas i ich wykorzystywanie » 2017-01-31 00:37:27 Witam. Czytałem tematy na forum i trafiłem na słowo kluczowe template. Znalazłem kurs na forum http://cpp0x.pl/kursy/Kurs-C++/Szablony-funkcji/315 . Z tego co zrozumiałem, dzięki template tworzymy jakby typ, który nie wiadomo czym jest. template < class typ > typ funkcja( typ zmienna ) { return zmienna * zmienna; }
I jeśli wywołamy tą funkcję w taki sposób: int main() { double = funkcja < double >( 10, 5 ); }
To jest jasne. Ale teraz przejdźmy do szablonów klas: W kursie mamy: template < int ilosc > class tablica_typu_int { public: int zmienna[ ilosc ]; int zmienna_zawierajaca_prawidlowa_ilosc; }; int main() { tablica_typu_int < 11 > nowa; }
Po co to? Czy nie łatwiej po prostu napisać konstruktora, który nam stworzy taką tablicę? Znaczy jedyna różnica to to, iż ta tablica jest statyczna (nie dynamiczna). Ale czy tylko po to to jest? Z tego co widziałem na wiki to jest tam lepszy przykład: https://pl.wikipedia.org/wiki/Szablon_klasy A więc szablony klas pozwalają stworzyć "uniwersalną" klasę. Tylko... po co? Klasy są zwykle robione precyzyjnie pod jakąś rzecz. Jak tu zrobić klasę, która ma mieć 10 konkretnych zmiennych, i dane funkcje i pogodzić ją z klasą która ma 2 zmienne i zaledwie kilka metod? Nie da się chyba zrobić szkieletu klasy, która pogodziłaby klasę człowiek składniki imie, nazwisko itp. z klasą mikrofalówka składniki napięcie, natężenie, moc itp. |
|
1aam2am1 |
» 2017-01-31 01:39:27 Takie rzeczy się robi aby nie pisać ciągle tego samego. Mamy klasę basic_ostream i basic_ostream<char> to cout a basic_ostream<wchar> to wcout
Mają te same funkcje,operują na tym samym wyjściu. Jedyne czym się różnią to typem danych wypisywanych. cout wypisuję w kodowani konsoli. A wcout powinien w utf-8.
PS. wcout nigdy nie działa i są z nim same problemy więc lepiej z niego nie korzystać. Ale jeżeli chodzi o template można stworzyć wiele zaawansowanych klas, które piszą nam kod za nas.
Np. Pewien facet na github wykorzystał template, c++11 i zapewnił bind każdej funkcji przyjmującej tylko typy podstawowe do pewnej klasy. Klasa ta pozwalała połączyć się z jego inną aplikacją i zdalnie asynchronicznie lub synchronicznie wywoływać funkcje. Serwer kazał wywołać bindowaną funkcje lokalnie. Za pomocą template. Kod taki to około 100. Gdybym chciał to zrobić dla jednego wzoru funkcji przyjmującej załóżmy jeden int. To jest to 20 linijek kodu. Ale przy większych projektach. 20 linijek dla każdej funkcji to za dużo. Pisze się raz 100 i wszędzie się tego template wykorzystuje do bindowania funkcji. Gdy coś nie działa wiadomo gdzie trzeba zajrzeć. A to tylko czubek góry lodowej.
|
|
mateczek |
» 2017-01-31 08:43:23 Template - Przydatność szablonów klas i ich wykorzystywanie |
Ludzie piszący kompilator i tworzący standard języka nie są debilami, I skoro wymyślili i wprowadzili szablony, funkcje virtualne, to nie dla hecy, ale po to, iż były potrzebne. Wszystkie kontenery, cała biblioteka STL (Standard Template Library) http://cpp0x.pl/kursy/Kurs-STL-C++/114 - nikt tego nie pisał dla jaj. Jeśli choc raz użyłeś choćby kontenera vector czy jakiegokolwiek strumienia to sam sobie odpowiedz czy są potrzebne??; |
|
karambaHZP |
» 2017-01-31 09:52:18 template < int ilosc > class tablica_typu_int { public: int zmienna[ ilosc ]; int zmienna_zawierajaca_prawidlowa_ilosc; }; |
To jest prosta implementacja już dostępnej klasy std::array<>. Czy nie łatwiej po prostu napisać konstruktora, który nam stworzy taką tablicę? |
Tak jak wspomniałeś, można dynamicznie w konstruktorze, lecz taka stała tablica jest szybsza od dynamicznej. std::array <> to zwykła tablica opakowana w klasę, której wydajność jest nie mniejsza od gołej stałej tablicy. Klasa zapewnia bezpieczeństwo i kontrolę tablicy, z której możemy skorzystać. Przydatność szablonów klas |
Docenisz, gdy zaczniesz korzystać ;) http://wazniak.mimuw.edu.pl/index.php?title=Zaawansowane_CPP/Wyk%C5%82ad_1:_Szablony_IWczoraj przewinął się temat szablonu klasy: Skrócone wywołanie funkcjiA tak to wygląda wg MSDN: https://4programmers.net/Pastebin/6341Korzyścią jest też produkcja klasy gdy jest potrzebna, a nie na zapas, jak w przypadku zwykłych klas (funkcji). |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-01-31 20:34:12 Ludzie piszący kompilator i tworzący standard języka nie są debilami, I skoro wymyślili i wprowadzili szablony, funkcje virtualne, to nie dla hecy, ale po to, iż były potrzebne. |
Wiem, nigdzie tak nie twierdziłem. Po prostu chciałem się dowiedzieć, do czego się przydają. Vectorów już raz używałem, nie wiedziałem wtedy jednak o istnieniu template. Na razie tematu nie zamykam, może będę chciał się coś dopytać:) |
|
« 1 » |