• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jawna konkretyzacja, jawna specjalizacja Pytania

Object Storage Arubacloud
+1 głos
996 wizyt
pytanie zadane 10 marca 2016 w C i C++ przez Szahid Pasjonat (20,930 p.)

Nie rozumiem paru zagadnień z książki Praty. Mam nadzieje że mi pomożecie. 

1 "Jawne konkretyzacje mogą być tworzone również poprzez użycie funkcji w programie".  Czyli można je używać poza funkcją? Jak?

2 Według mojego rozumowania jawnej konkretyzacji używa się gdy chcemy użyć szablonu funkcji gdzie w prototypie są np dwa parametry typu t a my chcemy podać np  paramert int oraz double ( i chcemy żeby kompilator przekonwertował int na double a nie odwrotnie) .Wtedy robimy  funkcja<parametr na jaki konwertujemy>(parametr1,paramert2)  Czy dobrze rozumuje ? 

3 Mam fragment kodu;

...
template<class T>
void Swap( T &,T&);
template <> void Swap<job>(job &, job&); 

int main(void)
template void Swap<char>(char &, char&); //jawna konkretyzacja 
( nie rozumiem co robi powyższa linijka i jaki jest jej sens intnienia) 

(jakiś kod który rozumiem)

char g,h;
Swap(g,h); //użycie jawnie skonkretyzowanego szablonu
( i tego nie rozumiem co to mi da)

W nawiasach są moje uwagi. 

 

3 odpowiedzi

+1 głos
odpowiedź 10 marca 2016 przez MetGang Nałogowiec (34,360 p.)
edycja 11 marca 2016 przez MetGang

Pomijając dziwne umiejscowienie maina...

Jawna konkretyzacja to takie polskie określenie na template specialization, a znaczy ona mniej więc tyle, że dla konkretnych przypadków używamy innych funkcji/klas/struktur.

template<typename T> struct is_void : std::false_type // primary template
{};

template<> struct is_void<void> : std::true_type // explicit specialization for T = void
{};

Przykład praktyczny z C++, ale przedstawię bardziej zrozumiały przykład:

template <typename T> T Add(T a, T b) 
{ return a + b; }

template<> MyNumber Add<MyNumber> (MyNumber a, MyNumber b)
{ return a.GetInt() + b.GetInt(); }

Dla typów wbudowanych i tych co mają zadeklarowaną funkcję operatorową + nie będzie problemu, lecz gdy na przykład Twoja klasa wymaga dodatkowej rzeczy takiej jak GetInt(), aby przeprowadzić obliczenia, musisz zrobić specjalizację, która obsłuży ten przypadek.

Zamiast specjalizacji można by było w sumie zrobić osobną funkcję. A jak Ci się to rzeczywiście przyda to już zależy od Ciebie. Przydaje się to głównie w meta-programmingu.

komentarz 12 marca 2016 przez Szahid Pasjonat (20,930 p.)
1 Co to jest meta programowanie ?

2 Czy napewno opisałeś jawną konktetyzację ( bo według mnie piszesz o jawnej specjalizacji)

 

PS: Przepraszam że z takim opóźnieniem
komentarz 12 marca 2016 przez MetGang Nałogowiec (34,360 p.)

Jak tak patrzę po tym jak koledzy zwrócili mi uwagę to istnieje możliwość, że pomyliłem te dwie rzeczy, ale konkretyzacja i specjalizacja wydaje się byś synonimem. Możliwe, że konkretyzacja jest tak jakby kolejnym poziomem specjalizacji lub coś podobnego. Nie zagłębiałem się tak bardzo w szablony.

Co do meta-programowania, jest to tak jakby przeniesienie pracy z czasu trwania programu do czasu jego kompilacji z wykorzystaniem najczęściej struktur. Taki najprostszy przykład:

template <int T> struct MultiplyBy10
{
    static constexpr int value = T * 10;
};

std::cout << MultiplyBy10<7>::value << std::endl;
// wypisze 70, które zostanie obliczone w trakcie kompilacji

Całe <type_traits> (jak np. std::is_same<>) są zrobione w podobny sposób.

+1 głos
odpowiedź 13 marca 2016 przez pingwindyktator Użytkownik (520 p.)

Ja bym powiedział, że:

template specialization / partial template specialization / full template specialization mają swoje odpowiedniki w języku polskim jako "specjalizacje szablonów". Pojęcie wyjaśnione przez @MetGang.

Natomiast "konkretyzacja szablonu" to stworzenie pewnej rzeczywistej klasy z szablonu. Mając

template <typename T> class foo { };

w programie nie istnieje żadna klasa. Istnieje jedynie szablon klasy, który klasą sam w sobie nie jest. Jak zatem stworzyć klasę? Ano tak

foo<int> bar;

W tym momencie kompilator generuje kod klasy.

Problematyczne jest to, że używasz polskich nazw. Najbardziej prawidłową odpowiedzą na Twoje pytanie jest "nie ma czegoś takiego jak specjalizacja / konkretyzacja szablonów. Szablonów też nie ma". Shame on you.

komentarz 13 marca 2016 przez Szahid Pasjonat (20,930 p.)
Nie mam na myśli klas tylko funkcji.

Możesz podac przykład konkretyzacji funkcji ?
komentarz 13 marca 2016 przez pingwindyktator Użytkownik (520 p.)
template <typename T>
void print_me (const T &t) {
    std::cout << t;
}

print_me<int>(4);

 

0 głosów
odpowiedź 13 marca 2016 przez Szahid Pasjonat (20,930 p.)
Może się ktoś jeszcze wypowiedzieć ?

Podobne pytania

0 głosów
1 odpowiedź 1,660 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez Evelek Nałogowiec (28,960 p.)
+1 głos
2 odpowiedzi 321 wizyt
pytanie zadane 14 września 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
2 odpowiedzi 156 wizyt
pytanie zadane 14 lutego 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...