Forum » Programiranje » [c++] Heterogeni kontejner
[c++] Heterogeni kontejner
zhigatsey ::
Živjo,
V std::list bi rad spravil vrednosti različnih tipov. To sem naredil tako, da je razred Value dedovan iz razreda ValueBase,
katerih kazalce lahko pomečem v kontejner.
Problem oz. grdo se mi zdi pridobivanje vrednosti iz kontejnerja...
Kar me zanima je samo vrednost spremenljivke m_value, katero pa lahko
dobim samo s castanjem (recimo metodi getValueAsString(), getValueAsInt() )...
Ali bi lahko kako določil dejanski tip kazalca ValueBase* brez kupa if stavkov z dynamic_cast za vsak tip posebej...
Ali bi tukaj lahko uporabil novo funkcionalnost c++0x -> (auto-typed variables)
Ali je še kakšna druga alternativa glede tega...
Hvala za odgovore
V std::list bi rad spravil vrednosti različnih tipov. To sem naredil tako, da je razred Value dedovan iz razreda ValueBase,
katerih kazalce lahko pomečem v kontejner.
class ValueBase
{
public:
virtual std::string getValueAsString() = 0 const;
virtual int getValueAsInt() = 0 const;
...
...
};
template<class Type>
class Value : public ValueBase
{
public:
Value(const Type& value)
: m_value(value)
{}
const Type& getValue() const
{
return m_value;
}
void setValue(const Type& value)
{
m_value = value;
}
virtual std::string getValueAsString() const
{
return convert<Type, std::string>(m_value); -- convert je podobna funkcija kot lexical_cast (uporablja se stringstream)
}
virtual int getValueAsInt() const
{
return convert<Type, int>(m_value);
}
private:
Type m_value;
};
................................................
std::list<ValueBase*> values;
Value<int> stevilo(2);
Value<std::string> niz(std::string("bla bla"));
values.push_back(&stevilo);
values.push_back(&niz);
Problem oz. grdo se mi zdi pridobivanje vrednosti iz kontejnerja...
Kar me zanima je samo vrednost spremenljivke m_value, katero pa lahko
dobim samo s castanjem (recimo metodi getValueAsString(), getValueAsInt() )...
Ali bi lahko kako določil dejanski tip kazalca ValueBase* brez kupa if stavkov z dynamic_cast za vsak tip posebej...
Ali bi tukaj lahko uporabil novo funkcionalnost c++0x -> (auto-typed variables)
Ali je še kakšna druga alternativa glede tega...
Hvala za odgovore
3p ::
Ali bi lahko kako določil dejanski tip kazalca ValueBase* brez kupa if stavkov z dynamic_cast za vsak tip posebej...
Ko bi neposredno določil dejanski tip, bi pa verjetno spet potreboval kup if stavkov?
Ne verjamem, da boš bistveno pametneje rešil tole z vstavljanjem in jemanjem svojih objektov iz seznama. Če pa boš povedal, kaj hočeš s tem dejansko deseči, pa bo mogoče kdo prispeval kako idejo, kako se stvari drugače lotiti.
Ena bolj osnovnih je pač ta, da se vprašaš, kaj dejansko s temi zadevami, ki jih daješ v seznam počneš (najbrš pretvorba ni cel smisel). Potem pač denimo kar na ta osnovno razred obesiš virtualno metodo, ki to zadevo opravi, in jo overridaš v izpeljanih razredih. Iz seznama dobiš sicer kar ValueBase, ampak te nič ne briga, ti samo pokličeš valueBase.NarediXXX()...
Vredno ogleda ...
| Tema | Ogledi | Zadnje sporočilo | |
|---|---|---|---|
| Tema | Ogledi | Zadnje sporočilo | |
| » | c++ rabim pomoč konstuktorjiOddelek: Programiranje | 1229 (924) | Snowflake2 |
| » | [WPF] Vrednost Textbox kot "angle" v AxisAngleRotation3DOddelek: Programiranje | 933 (868) | saule |
| » | Največje računalniške napake v zgodoviniOddelek: Novice / Znanost in tehnologija | 17326 (13953) | MrStein |
| » | [C++]Instanca razredaOddelek: Programiranje | 1696 (1587) | Senitel |
| » | [C++] Pretvorba iz int v char *Oddelek: Programiranje | 3099 (2475) | Gundolf |