Ho un SystemModeDataResolver
che contiene una classe di dati di base per qualsiasi classe di template SystemModeData
che viene fornita. La classe SystemModeData
è basata su enum. SystemModeDataResolver
ha un metodo basato su modelli chiamato getConfig()
che restituisce un puntatore (condiviso) convertito dinamicamente ai dati di base che il risolutore detiene, dato il parametro del modello enum. Il problema ora è che ho due progetti (anche in spazi dei nomi diversi) in soluzione usando lo stesso enum per risolvere le sue classi di dati, ma mi piacerebbe avere diverse configurazioni. Come farlo? La soluzione semplice è mettere il proprio resolver in ciascuna delle soluzioni, ma questo porta solo a molti codici duplicati, senza contare le classi di dati che dovrebbero essere tutte copiate e alcune di esse sono generali e alcune di esse sono specializzate per enum.
Un altro approccio sarebbe quello di aggiungere un altro parametro del modello, ma ciò complica molto la situazione. Tutte le classi di dati specializzate di tutti gli altri progetti dovrebbero trovarsi in uno spazio dei nomi comune (cosa che vorrei evitare).
Classe SystemDataMode - SystemModeDataBase definisce solo l'interfaccia, SystemMode è l'enum
template<SystemMode SM, typename = void>
class SystemModeData : public SystemModeDataBase
{
public:
virtual SystemMode getSystemMode() override
{
return SM;
}
};
Specializzazione di SystemDataMode per alcuni SystemMode. Questa specializzazione è solo per un progetto (è in un diverso spazio dei nomi - a scopo dimostrativo spazio dei nomi A )
template<SystemMode::Production>
class SystemModeData : public SystemModeDataBase
{
public:
virtual SystemMode getSystemMode() override
{
return SM;
}
int foo()
{
return 42;
}
};
SystemModeDataResolver
class SystemModeDataResolver
{
private:
std::shared_ptr<SystemModeDataBase> baseData;
public:
SystemModeDataResolver(std::shared_ptr<SystemModeDataBase> baseData) :
baseData(baseData)
{}
public:
SystemMode getSystemMode() const
{
return baseData->getSystemMode();
}
std::shared_ptr<SystemModeData<SM>> getConfig()
{
return std::dynamic_pointer_cast<SystemModeData<SM>>(baseData);
}
};
Uso
// namespace A
SystemModeDataResolver resolver(std::make_shared<SystemModeData<SystemMode::Production>>());
resolver.getConfig<SystemMode::Production>(); // gets the general systemModeData, because resolver and getConfig() method returns data classes from namespace B
Quindi in questo scenario nel namespace A il getConfig()
dovrebbe restituire il SystemModeData
specializzato per il dato SystemMode
. In qualsiasi altro spazio dei nomi, dovrebbe fornire la classe dati generale solo con il metodo getSystemMode()
al suo interno. Non funziona per ovvi motivi e questo potrebbe essere cambiato in due modi descritti sopra, ma non mi piace che nessuno di loro abbia mancato di trovare un'altra soluzione. Potrebbe anche essere che in questa impostazione (classi di dati basate su modelli) non sia nemmeno possibile.