2012-06-25 10 views
6

to, co chcę zarchiwizować, to prosty sposób, aby niektóre zmienne były trwałe. W tym celu napisałem klasę PeristenceProvider, która opakowuje funkcję drzewa właściwości boost do przechowywania danych w plikach xml/ini.c + + utrzymywanie danych

W tej chwili muszę robić rzeczy tak:

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

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

ale czy istnieje szansa, aby ukryć to w taki sposób, jak to:

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

myślę, że można zbliżyć się z szablonów, ale trzeba makro magia, aby tak dokładnie było. – Stormenet

+1

Jeśli potrzebujesz generować identyfikatory ciągów znaków z nazw zmiennych, będziesz potrzebował makr. –

+0

Czy możesz przekazać literał ciągu jako parametr szablonu? – tmpearce

Odpowiedz

0

Brzmi jak nie utrzymują mnóstwo informacji - tylko kilka parametrów wyboru. Jeśli tak, to po prostu zapisz wywołania funkcji w swoich własnych funkcjach, które przyjmują dwa argumenty - std :: string lub const char * oraz typ elementu, który został utrwalony. Jeśli liczba typów, które są utrzymywane, jest ograniczona (na przykład int, double, std :: string), to zadziała dobrze.

1

Jest to możliwe, ale nie w taki sposób. Nie można używać literałów łańcuchowych do tworzenia instancji szablonu. Obiekty ciągów z łączeniem zewnętrznym mogą mieć wyłącznie argumenty inne niż typy. Stała ciągowa musi być zdefiniowana jako extern i być char[], a nie tylko char*.

Zobacz przykład (to wydrukować „Hello” i „Świat”, naprawdę fajne, nie?):

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; 
Powiązane problemy