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

Szablony i rzutowanie klasy bazowej na dziedziczoną

Object Storage Arubacloud
0 głosów
170 wizyt
pytanie zadane 14 sierpnia 2020 w C i C++ przez Erichu Nowicjusz (230 p.)
edycja 14 sierpnia 2020 przez Erichu

 Witam, mam następujący kod:

using unsigned long long = entityId;
struct component
{
    entityId entity;

    virtual component * self(){return this;}
};

Jest to struktura bazowa do ECS.

Następnie deklaruję dzieci:

struct positionComponent : public component
{
  float px;
  float py;

positionComponent * self() override {return this;}
};

Tak mniej więcej wygląda struktura ECS w mojej aplikacji.

Teraz, piszę edytor, żeby móc łatwo tworzyć nowe Entity;

Trzymam wszystkie komponenty jako wskaźniki na strukturę component.

Chciałbym w pewnym miejscu wywołać funkcję, która będzie wyświetlać edytor danego komponentu.

Próbowałem czegoś takiego:

template<typename T>
static void renderEditor(T *  pComp)
{
	
}
template<>
inline void renderEditor<positiontComponent>(movementComponent * pComp)
{
	//tutaj kod obsługujący edytor danego komponentu
}

I w miejscu wywołania:

renderEditor<decltype(com->self())>(com)

(wiem, że w tym przypadku decltype raczej zwróci wskaźnik, ale nie o to chodzi)

Niestety zostaje wywołany szablon dla<component *> a nie dla klasy dziedziczącej

I moje pytanie brzmi, czy da się napisać to tak, aby dla wskaźnika na klasę bazową z przypisanym dzieckiem wywołać szablon dla dziecka?

Wirtualna funkcja dla componentu typu editSelf() nie wchodzi w grę, bo chcę aby component został tylko strukturą.

Miałem nadzieję uniknąć castowania( w miejscu wywołania wiem, z jakim componentem mam do czyniena, ale nie chcę pisać dużego if'a)

EDIT: Po sprawdzeniu, które metody self() są wywoływane, okazuje się, mimo tego, że metoda dziecka zwraca wskaznik do siebie  to jest on konwertowany na wskaznik do klasy bazowej

Z góry dziękuję za pomoc

 

 

 

1 odpowiedź

0 głosów
odpowiedź 14 sierpnia 2020 przez Oscar Nałogowiec (29,290 p.)

Nie bardzo rozumiem, co chciałeś przekazać w tym zdaniu:

Wirtualna funkcja dla componentu typu editSelf() nie wchodzi w grę, bo chcę aby component został tylko strukturą.

w momencie gdy i tak już masz wirtualną metodę self w tej klasie.

 

komentarz 14 sierpnia 2020 przez Erichu Nowicjusz (230 p.)
Chodzi mi o to, ze plik z komponentami jest uzywany w kilku projektach(edytor jest tylko jednym z nich)

Teorytycznie moglbym dac kolejna metode wirtualna, ale problem polega na tym, ze w edytorze korzystam z ImGui do renderowania, a w glownym projekcie juz nie. Nie moge zatem dodac czegos w stylu:

virtual void renderEditor()

{

ImGui::Begin()....

}

bo spowoduje to errory w innych projektach.

Poza tym w ECS component ma byc tylko zbiorem danych interpretowanym przez systemy. Metoda self() jest moim zdaniem uzasadniona, bo zwraca teorytycznie wskaznik do klasy dziedziczacej

Podobne pytania

0 głosów
1 odpowiedź 674 wizyt
0 głosów
2 odpowiedzi 331 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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!

...