contador de tempo de compilação para classes de modelo
Imagine que você tem muitas classes com vários parâmetros de modelo diferentes. Toda classe tem um métodostatic void f()
. Você deseja coletar todos esses ponteiros de função em uma lista L.
Uma solução em tempo de execução seria fácil:
typedef void (*p)();
std::vector<p> L;
int reg (p x) { static int i = 0; L.push_back(x); return i++; } // also returns an unique id
template <typename T> struct regt { static int id; };
template <typename T> int regt<T>::id = reg (T::f);
template < typename ... T > struct class1 : regt< class1<T...> > { static void f(); };
template < typename ... T > struct class2 : regt< class2<T...> > { static void f(); };
// etc.
O compilador sabe tudof()
s de todas as classes instanciadas em tempo de compilação. Portanto, teoricamente, deve ser possível gerar uma lista desse tipo (umconst std::array<p, S> L
com algumS
) como uma lista constante em tempo de compilação. Mas como? (As soluções C ++ 0x também são bem-vindas).
Por que eu preciso disso?
Em uma arquitetura com apenas 256 kB (para código e dados), preciso gerar objetos para os IDs de classe recebidos. As estruturas de serialização existentes ou a solução de tempo de execução acima são desnecessariamente grandes. Sem modelos, seria fácil uma solução em tempo de compilação, mas quero manter todas as vantagens que os modelos oferecem.