Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie specjalizacji szablonu wewnatrz funkcji

Ostatnio zmodyfikowano 2017-02-10 23:55
Autor Wiadomość
en2senpai
Temat założony przez niniejszego użytkownika
Tworzenie specjalizacji szablonu wewnatrz funkcji
» 2017-02-09 12:47:08
Witam,

Czy w c++ istnieje mozliwosc tworzenia specjalizacji obiektow szablonowych wewnatrz funkcji, poprzed podanie jako argument funkcji parametru okreslajacego specjalizacjie ?

Dla przykladu, mam klase szablonowa ktora utozsamia stos

C/C++
template < uint32_t stackSize >
class stack
{
    uint32_t _stack[ stackSize ];
   
public:
    stack();
    ~stack();
};

Czy istnieje mozliwosc napisania funkcji do tworzenia obiektow klasy stos z ich konkretna specjalizacja ? (np.)

C/C++
void nowyStos( const uint32_t stackSize )
{
    stack < stackSize > nowyObiekt;
}
P-157530
pekfos
» 2017-02-09 12:50:54
Parametry szablonu muszą być znane w czasie kompilacji.
P-157531
en2senpai
Temat założony przez niniejszego użytkownika
» 2017-02-09 12:55:57
Zatem czy wywolanie proponowanej przeze mnie funkcji

C/C++
nowyStos( 10 );

jest utozsamiane jako znajomosc specjalizacji w trakcie kompilacji?
P-157533
pekfos
» 2017-02-09 13:03:41
Nie. Na etapie kompilacji funkcji nie wiadomo, jakie są (lub będą) jej wywołania i z jakimi wartościami. Kod funkcji generowany jest raz. Co miałoby się stać, gdyby były dwa wywołania, dla 10 i 20? Albo gdyby nie było żadnych wywołań, a funkcja jest kompilowana jako część biblioteki?
W tym przypadku, pamięć na stos powinna być alokowana dynamicznie. Bardziej na parametr szablonu nadaje się tu typ elementu na stosie.
P-157535
en2senpai
Temat założony przez niniejszego użytkownika
» 2017-02-09 13:21:16
Stworzylyby sie 2 obiekty o roznych rozmiarach.

W calym tym zamieszaniu chodzi o to aby klasa stack realnie zajmowala miejsce w pamieci (sizeof(stack)/4 zwroci pojemnosc stosu). Wiem ze mozna to zrobic przez new , jednak w tym przypadku stack bedzie tylko trzymal uint32_t * stackStart, wiec fizycznie klasa zajmuje 1 WORD w pamieci zamiast wielkosci stosu.

Jezeli teraz umiescimy cos pod obiektem stosu ktory przetrzymuje jedynie uint32_t * stackStart, nadpisze on jakby 1 element stosu. Stanie sie to poniewaz program jest programem EMBEDDED, oraz nie moge kozystac z klasycznego new ktory by mi to zaalokowal, zreszta w innej czesci pamieci niz bym chcial (do dyspozycji mam jedynie placement new aby nad wszystkim panowac)

Chodzi o to, aby kazda klasa zawierajaca stos automatycznie zwiekszala swoj rozmiar.
P-157537
michal11
» 2017-02-09 13:25:39
Skoro to ma być tablica statyczna to jak twoim zdaniem ma to działać jeżeli czasami chcesz żeby miała 10 elementów a czasami 20 a czasami może i 1000000?
P-157539
en2senpai
Temat założony przez niniejszego użytkownika
» 2017-02-09 13:30:33
Przeciez tak dziala szablon, w ktorym mozna podawac liczbe swiadczaca o dlugosci tablicy  - a mimo to tablica jest powolywana STATYCZNIE ! Chodzi jedynie o przekazanie parametru do szablonu.
P-157540
en2senpai
Temat założony przez niniejszego użytkownika
» 2017-02-09 13:33:56
Zapewnie wiecie iz istnieje mozliwosc dokonania tego SZABLONEM FUNKCJI jednak caly czas nie uciekamy od szablonu idac w gore hierarchii wywolan

C/C++
tempate < uint32_t stackSize > void utworzObiekt()
{
    stack < stackSize > obiekt;
}
P-157541
« 1 » 2
  Strona 1 z 2 Następna strona