Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ template vector

hyrppa95 [14.03.2012 21:36:47]

#

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

Metabolix [14.03.2012 22:05:06]

#

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.

Pekka Karjalainen [18.03.2012 12:34:24]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta