Co oznacza taki szablon?

0

Witam,

Napotkałem ostatnio w kodzie taką konstrukcję:

 
template <class nazwaTypu>
class NazwaKlasy
	: public nazwaTypu
{
 //...
}

Jak należy rozumieć dziedziczenie parametru formalnego szablonu?
Czy możliwe jest, by istniała klasa o tej samej nazwie co parametr szablonu?

0

Jako, że szablony w C++ są ewaluowane jako pełne typy podczas kompilacji, tak, możliwe jest użycie argumentu szablonowego jako typu klasy bazowej.

0

Dzięki za szybką odpowiedz:)
A jak należy to rozumieć, co daje dziedziczenie argumentu szablonowego?
Należy przyjąć, że jest to jakaś klasa i traktować to jako zwykłe dziedziczenie klasy?

0

Tak. Możesz normalnie korzystać z klasy bazowej nakładając jednocześnie na nią ograniczenia (constraints). Kod skompiluje się tylko wtedy, gdy wszystkie typy podane jako argument szablonowy będą posiadać wykorzystane pola / metody.

0
Rev napisał(a):

...będą posiadać wykorzystane pola / metody.

Masz na myśli pola i metody znajdujące się w szablonie?

1

To tzw. static polymorphism, a ściśle CRTP w C++ - trochę o tym pisze w internecie, na przykład http://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism albo http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern.

#include <iostream>

template <class Derived> 
struct Base
{
    void generic_alg()
    {
        interface("aaaa");
        interface("bbbb");
    }

    void interface(const char *c)
    {
        ((Derived*)this)->implementation(c);
    }
};
 
struct DerivedA : Base<DerivedA>
{
    void implementation(const char *c)
    { std::cout << "cout << " << c << " << endl;" << std::endl; }
};

struct DerivedB : Base<DerivedB>
{
    void implementation(const char *c)
    { std::cout << "puts(" << c << ");" << std::endl; }
};

int main()
{
    DerivedA a;
    a.generic_alg();

    DerivedB b;
    b.generic_alg();
}

Osiągasz dzięki temu quasi-polimorfizm (klasa bazowa może korzystać z dziedziczonej jak w przykładzie), a jednocześnie kod wykonuje się bez żadnej straty wydajności. Nie jest to oczywiście cudowne rozwiązanie wszystkich problemów, ale czasami przydatna sztuczka

0

dziękuje wszystkim za pomoc:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1