Nazwa wątku dość ciężka, ale nie wiedziałem jak dokładnie określić problem.
Przechodząc do rzeczy.
- Mamy prostą "listę"
template< typename ListHead, typename ListTail >
struct CTList {
typedef ListHead Head;
typedef ListTail Tail;
};
// dodawanie, liczenie elementów, itd.
- Kolejny krok to definicja "pola"
template< typename ValueType, int Num = 0 >
struct Member {
using Type = ValueType;
static const int GetNum() { return Num; }
};
- 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
}
- 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++ :)