Rozszerzanie predefiniowanej szablonowej listy typów

0

Nazwa wątku dość ciężka, ale nie wiedziałem jak dokładnie określić problem.
Przechodząc do rzeczy.

  1. Mamy prostą "listę"
template< typename ListHead, typename ListTail >
struct CTList {
typedef ListHead Head;
typedef ListTail Tail;
};
// dodawanie, liczenie elementów, itd.
 
  1. Kolejny krok to definicja "pola"
template< typename ValueType, int Num = 0 >
struct Member {
using Type = ValueType;
static const int GetNum() { return Num; }
}; 
  1. Następnie definiowana jest klasa zawierająca całą "magię" (
// template< typename UserClass >  -> zapewne bez jakiegoś CRTP się nie obejdzie
class ListHandler : public ListHandlerInterface { 
 std::vector< IVector* > vectors;
template< MemberClass >
IVector* GetData() { 
const uint pos = FindElement< List, MemberClass >::result;
return vectors[ pos ];
}
// black magic 
} 
  1. Ostatnim krokiem jest klasa definiowana przez użytkownika, w której jedyne co trzeba zrobić to zadeklarować jakiego typu elementy ma zawierać
class UserClass {
using PositionX = AddMember< float, 1 >;
using PositionY = AddMember< float, 2 >;
  

W czym rzecz:
Czy wykonalne jest takie zaimplementowanie klasy ListHandler, aby:

  • zawierała listę wszystkich pól zdefiniowanych przez użytkownika w klasie UserClass? Jak w przykładzie powyżej, jeśli zostanie dodany element PositionX to ten pseudo-szablon AddMember doda podany typ do listy, którą trzyma ListHandler. Kolejne pole = kolejny typ dodany do listy.
  • Klasa ListHandler posiadałaby metodę, która w czasie rzeczywistym tworzyłaby kolejno wektory dla wszystkich typów z listy
    ( const unsigned elems = Length< List >;
    for ( unsigned i = 0; i < elems; ++i ) { vectors.emplace_back( new vector< GetEleme< List, i >::Type > ); } )

Oczywiście ten kod to taka luzna idea warstwowego frameworka. Pytanie tylko czy jest to wykonalne i czy nie za bardzo poniosła mnie fantazja po lekturze kilku artykułów nt. metaprogramowania i ogółem świata szalbonów C++ :)

1

Można by tak zrobić, tylko to raczej nie ma sensu. Dlaczego po prostu nie utworzysz listy obiektów typu UserClass ?
W każdym razie, jeśli koniecznie chcesz bawić się z tym co napisałeś to UserClass musi być templatowe, natomiast ListHandler musi dziedziczyć po UserClass<ListHandlerInterface> (tak, jak wspomniałeś bez CRTP się nie obejdzie).

0

Wiem, że kombinuję jak koń pod górę, ale to tylko po to żeby poznać moc szablonów ;)
Trafiłem na ciekawy pomysł enkapsulacji danych w DOD i tak w ramach treningu staram się to zrozumieć i eksperymentować

część I : http://bannalia.blogspot.com/2015/08/c-encapsulation-for-data-oriented-design.html
część II: http://bannalia.blogspot.com/2015/09/c-encapsulation-for-data-oriented.html
część III: http://bannalia.blogspot.com/2015/11/soa-container-for-encapsulated-c-dod.html

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