Elikkä olis tämmönen luokka:
template <class T> class Variable { public: T value; string name; }
Saisko tuosta mitenkään tehtyä vektoria, johon vois laittaa eri tyyppisiä luokkia (int, string, float jne.)?
Tyyliin:
template <class T> vector<Variable<T>> muuttujat; // lisätään pari muuttujaa Variable<int> numero; numero.value = 200; Variable<float> desimaali; desimaali.value = 23.9f; muuttujat.push_back(numero); muuttujat.push_back(desimaali);
(Ei toimi :( )
Et voi tehdä noin. Muuttujalla on oltava käännösvaiheessa yksiselitteinen tyyppi.
Voit periyttää Variable-luokan jostain kantaluokasta (AnyVariable), jolla on virtuaalisia jäseniä (ainakin tuhoaja), jolloin voit käyttää dynaamista tyypinmuunnosta (dynamic_cast) olion todellisen tyypin selvittämiseen. Vektoriin täytyy tällöin tallentaa osoittimia tähän kantaluokkaan. Koodissa joudut käsittelemään eri tyypit erikseen, eli mikään geneerinen m[0].value + m[1].value
ei tule maagisesti toimimaan.
Jos haluaa käsitellä valmiiksi olemassaolevia tietotyyppejä yhtenäisesti, on Boost-kirjastossa tarjolla kaksi tapaa.
Boost::any voi sisältää mitä tahansa tyyppiä olevan arvon.
Boost::variant voi sisältää jonkin arvon määrittelyssä annetusta tyyppijoukosta.
Esim. boost::variant<int, float, std::string> on tietotyyppi, jonka arvo on aina jokin sen määrittelyssä mainituista tyypeistä. Se käyttäytyy kuten mikä tahansa yksittäinen tietotyyppi, joten luokalle voi määrittää tämän tyyppisen jäsenen, se voi olla jonkin säiliön tyyppiparametri jne.
Boostin dokumentaatiossa myös vertaillaan näiden toimintaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.