Tworzenie specjalizacji szablonu wewnatrz funkcji
Ostatnio zmodyfikowano 2017-02-10 23:55
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 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.) void nowyStos( const uint32_t stackSize ) { stack < stackSize > nowyObiekt; }
|
|
pekfos |
» 2017-02-09 12:50:54 Parametry szablonu muszą być znane w czasie kompilacji. |
|
en2senpai Temat założony przez niniejszego użytkownika |
» 2017-02-09 12:55:57 Zatem czy wywolanie proponowanej przeze mnie funkcji jest utozsamiane jako znajomosc specjalizacji w trakcie kompilacji? |
|
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. |
|
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. |
|
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? |
|
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. |
|
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 tempate < uint32_t stackSize > void utworzObiekt() { stack < stackSize > obiekt; }
|
|
« 1 » 2 |