Предположим, у меня есть данные для каждого класса: (AandB.h)
class A
{
public:
static Persister* getPersister();
}
class B
{
public:
static Persister* getPersister();
}
... и еще много-много классов. И я хочу сделать что-то вроде:
persistenceSystem::registerPersistableType( A::getPersister() );
persistenceSystem::registerPersistableType( B::getPersister() );
...
persistenceSystem::registerPersistableType( Z::getPersister() );
... для каждого класса.
Мой вопрос: есть ли способ автоматизировать создание списка данных для каждого типа, чтобы мне не приходилось перечислять каждый тип в большом фрагменте (как в примере выше)?
Например, один из способов сделать это: (AutoRegister.h)
struct AutoRegisterBase
{
virtual ~AutoRegisterBase() {}
virtual void registerPersist() = 0;
static AutoRegisterBase*& getHead()
{
static AutoRegisterBase* head= NULL;
return head;
}
AutoRegisterBase* next;
};
template <typename T>
struct AutoRegister : public AutoRegisterBase
{
AutoRegister() { next = getHead(); getHead() = this; }
virtual void registerPersist()
{
persistenceSystem::registerPersistableType( T::getPersister() );
}
};
и используйте это следующим образом: (AandB.cxx:)
static AutoRegister<A> auto_a;
static AutoRegister<B> auto_b;
Теперь, после запуска моей программы, я могу безопасно выполнить: (main.cxx)
int main( int, char ** )
{
AutoRegisterBase* p = getHead();
while ( p )
{
p->registerPersist();
p = p->next;
}
...
}
чтобы собрать каждый фрагмент данных для каждого типа и зарегистрировать их в большом списке где-нибудь для последующего использования.
Проблема этого подхода заключается в том, что мне требуется добавить объект AutoRegister где-то для каждого типа. (то есть он не очень автоматический и его легко забыть сделать). А как насчет шаблонных классов? Что мне действительно нужно, так это чтобы экземпляр класса шаблона каким-то образом заставлял этот класс автоматически регистрироваться в списке. Если бы я мог сделать это, я бы избежал необходимости иметь пользователя класса (а не автора), чтобы не забыть создать:
static AutoRegister< SomeClass<X1> > auto_X1;
static AutoRegister< SomeClass<X2> > auto_X2;
...
etc....
для каждого экземпляра класса шаблона.
Что касается FIW, я подозреваю, что для этого нет решения.