Witajcie, próbuje napisać aplikacje(docelowo mini bibliotekę) która przetwarza plik CSS.
Ogólna koncepcja:
Próbuje stworzyć program który odczyta z pliku tesktowego np *.css, dane zapisane własnie w css-podobnym stylu.
appSettings
{
window-size-x:640px;
window-size-y:480px;
windowTittle: "CollName";
}
Aplikacja wczytuje plik, szuka zadany 'selektor' odczytuje jego własciwości i ich wartości i zapisuje je w obiekcie klasy CSelektor (myślałem nad kontenerem std::map lub std::multimap) a ten umozliwia pobranie wartosci przypisanej do danej właściwości.
Kontener (wspomiany wyżej) zawiera nazwę właściwości i przyporzadkowaną jej wartość zawartą w obiekcie klasy CValue
PROBLEM:
Pobranie wartości no właśnie, tu zaczynają się schody.
Plik CSS jest plikiem tekstowym więc początkowy format danych jest znany (std::string lub (const) * char) ale nie potrafię zdecydować w jaki sposób klasa CValue ma przechowywać wartość - czy jako łańcuch znaków czy może powinna tam znajdować się wartość przekonwetowaną do właściwego typu danych.
Opcja 1: wartość przechowywana jako łańcuch znaków. (Którą wybrałem by zaimplementować)
Wymusza to istnienie funkcji konwertującej do dowolnego typu. Jak [właściwie] napisać taka funkcję/metodę ?
Jak w języku C++ sprawdzić jakiego typu jest dana zmienna (znalazłem wzmianki o
typeid(Type)
)
Niestety to nie spełnia oczekiwań.
Opcja 2: wartość przechowywana w obiekcie klasy CValue już skonwertowana do właściwego typu.
To również rodzi komplikację gdyż potrzebna jest klasa potrafiąca przechowywać dowolny typ danych oraz zawiera pole z informacją jaki typ danych przechowuje.
Z tego wszystkiego moje pytanie: Jak to zrobić we właściwy sposób? Jakie właściwości języka należy wykorzystać (z cała pewnością funkcje/metody szablonowe i nowoczesne kontenery(map/multimap)) ?
Podaje kod.
Jest to uproszoczna klasa reprezentująca to co już mam.
PLIK: CValue.hpp
#ifndef VALUE_HPP_INCLUDED
#define VALUE_HPP_INCLUDED
#include <string> // std::string, std::stoi
#include <typeinfo>
#include <typeindex> // std::type_index
class CValue
{
public:
CValue();
virtual ~CValue();
void setValue(const std::string & _value);
template <class Typ>Typ getAs();
private:
std::string * m_value; //Czy nie lepiej wykorzystać łancuch znakow z C - wieksza kontrola np nad zużyciem pamieci ?
};
template <class Type>
Type CValue::getAs ()
{
if( m_value == nullptr || m_value->size() == 0)throw;
if(typeid(Type) == typeid(int))return std::stoi( *m_value);//Drabinka if'ow dla kazdego typu danych ? To chyba zly pomysl. Nalezy pamietac
///ze typeinfo nie dziala dla std::string
///......
}
#endif // VALUE_HPP_INCLUDED
PLIK: CValue.cpp
#include "Selector/Value/Value.hpp"
CValue::CValue()
:m_value( nullptr )
{
///NOTCHING///
}
CValue::~CValue()
{
delete m_value;
}
void CValue::setValue(const std::string & _value)
{
m_value = new std::string(_value);
}