Część.
Mam następujące klasy do zapisywania danych o różnych typach wewnątrz kontenera vector.
Rozwiązanie nie jest moje (trochę mi jeszcze brakuje wiedzy jeśli chodzi o część obiektową C++), do których dopisałem dwie metody.
class Property
{
public:
Property(const std::string& name)
: m_name(name) {}
virtual ~Property() {}
std::string get_type() //metoda dopisana
{
return m_name;
}
private:
std::string m_name;
};
template< typename T >
class TypedProperty : public Property
{
public:
TypedProperty(const std::string& name, const T& data)
: Property(name), m_data(data) {}
T get_value() //metoda dopisana
{
return m_data;
}
private:
T m_data;
};
typedef std::vector< std::shared_ptr<Property> > property_list_type;
Następnie tworzę przykładowy kod:
int main()
{
int a = 1;
property_list_type tab;
tab.push_back(std::shared_ptr<TypedProperty<int>>(new TypedProperty<int>("int",3)));
tab.push_back(std::shared_ptr<TypedProperty<std::string>>(new TypedProperty<std::string>("string", "Kasztan")));
tab.push_back(std::shared_ptr<TypedProperty<bool>>(new TypedProperty<bool>("bool", false)));
std::cout << tab[0] << std::endl;
while (!a == 0)
std::cin >> a;
return 0;
}
W tym momencie po odpaleniu programu, na ekranie terminalu pojawi mi się ciąg znaków oznaczających adres.
Mogę zamienić odniesienie do pierwszego elementu wektora na:
std::cout << tab[0] -> get_type();
i uzyskam stringa na którym zapisałem sobie jakiego typu jest przechowywana zmienna.
Nie mogę jednak zrobić następującej rzeczy:
std::cout << tab[0] - > get_value();
Rozumiem co jest tego przyczyną (vector obsługuje obiekty klasy Property), jednak nie wiem jak ten problem obejść.
Nie mogę utworzyć vector<TypedProperties> ponieważ kompilator wymaga ode mnie w tym momencie określenia typu, co zaprzecza całemu rozwiązaniu.
Mam nadzieję, że znajdzie się ktoś kto podzieli się swoją wiedzą lub nakieruje na rozwiązanie :)