Pobieranie danych z obiektów wewnątrz vector'a.

0

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 :)

4

Przede wszystkim, zainteresuj się boost::any i std::any (C++17). Generalnie, jeśli chcesz to robić dynamicznie to obsługujesz wyłącznie odgórnie wybrane typy i tyle (jakiś switch czy mapa).

1 użytkowników online, w tym zalogowanych: 0, gości: 1