2012-06-25 15 views
6

Lo que quiero archivar es una forma simple de hacer que algunas variables sean persistentes. Para esto escribí una clase PeristenceProvider que ajusta la funcionalidad del árbol de propiedades boost para almacenar datos en archivos xml/ini.C++ datos persistentes

En el momento en que tengo que hacer cosas como esta:

ClassA::ClassA() 
{ 
    m_valueI = PersistenceProvider::getInstance.get<int>("valueI"); 
} 

ClassA::~ClassA() 
{ 
    PeristenceProvider::getInstance.set<int>("valueI", m_valueI); 
} 

Pero ¿existe la posibilidad de ocultar esto de una manera como esto:

class ClassA 
{ 
    Persist<int, "valueI"> m_ValueI; 
} 
+0

creo que se puede conseguir cerca con las plantillas, pero para que necesitará macro magia para que sea exactamente así. – Stormenet

+1

Si necesita generar identificadores de cadena a partir de nombres de variables, necesitará las macros –

+0

¿Puede pasar el literal de cadena como un parámetro de plantilla? – tmpearce

Respuesta

0

suena como usted no está persistiendo toneladas de información, solo unos pocos parámetros de elección. Si es así, simplemente ajuste las llamadas a función en sus propias funciones que toman dos argumentos: std :: string o const char * y el tipo de elemento que persiste. Si la cantidad de tipos que persisten es limitada (por ejemplo, int, double, std :: string), esto funcionará bien.

1

Es posible pero no exactamente de esa manera. No puede usar cadenas literales para crear instancias de plantilla. Los objetos de cadena con enlaces externos solo pueden ser argumentos sin tipo. Así que la constante de cadena debe definirse como extern y ser char[], no solo char*.

Ver ejemplo (se imprime "Hola" y "Mundial", genial, ¿verdad?):

extern const char hello[] = "Hello"; 
extern const char world[] = "World"; 

template<const char* s> struct X 
{ 
    X() 
    { 
     std::cout << s << std::endl; 
    } 
}; 

X<hello> z1; 
X<world> z2; 
Cuestiones relacionadas