Ho un sacco "Property Set" (che sono semplici structs
contenenti membri POD). Vorrei modificare questi set di proprietà (ad es .: aggiungere un nuovo membro) in fase di esecuzione in modo che la definizione dei set di proprietà possa essere esternalizzata e il codice stesso possa essere riutilizzato con più versioni / tipi di insiemi di proprietà con il minimo /nessun cambiamento.
Ad esempio, un insieme di proprietà potrebbe assomigliare a questo:
struct PropSetA
{
bool activeFlag;
int processingCount;
/* snip few other such fields*/
};
Ma invece di impostare la sua definizione in pietra al momento della compilazione, mi piacerebbe crearlo dinamicamente in fase di esecuzione. Qualcosa come:
class PropSet propSetA;
propSetA("activeFlag",true); //overloading the function call operator
propSetA("processingCount",0);
E il codice dipendente dai set di proprietà (eventualmente in qualche altra libreria) userà i dati in questo modo:
bool actvFlag = propSet["activeFlag"];
if(actvFlag == true)
{
//Do Stuff
}
L'attuale implementazione dietro a tutto questo è la seguente:
class PropValue
{
public:
// Variant like class for holding multiple data-types
// overloaded Conversion operator. Eg:
operator bool()
{
return (baseType == BOOLEAN) ? this->ToBoolean() : false;
}
// And a method to create PropValues various base datatypes
static FromBool(bool baseValue);
};
class PropSet
{
public:
// overloaded[] operator for adding properties
void operator()(std::string propName, bool propVal)
{
propMap.insert(std::make_pair(propName, PropVal::FromBool(propVal)));
}
protected:
// the property map
std::map<std::string, PropValue> propMap;
};
Questo problema è simile alla domanda su SO e all'approccio attuale (descritto sopra) si basa su questa risposta. Ma come notato sopra a SO questo è più di un hack che una soluzione adeguata. I problemi fondamentali che ho con questo approccio sono i seguenti:
- Estendere questo supporto per supportare nuovi tipi richiederà un significativo cambio di codice. Al minimo indispensabile, gli operatori sovraccaricati devono essere estesi per supportare il nuovo tipo.
- Il supporto di proprietà complesse (ad esempio
struct
contenentestruct
) è complicato. - Supportare un meccanismo di riferimento (necessario per un'ottimizzazione della non duplicazione di set di proprietà identiche) è complicato. Questo vale anche per supportare puntatori e array multidimensionali in generale.
Esistono modelli noti per gestire questo scenario? In sostanza, sto cercando l'equivalente del modello visitatore , ma per estendere le proprietà class
anziché i metodi.
Modifica: Dichiarazione di problemi modificata per chiarezza e aggiunta un po 'di codice dall'attuale implementazione.