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