» »

[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.


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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c++ rabim pomoč konstuktorji

Oddelek: Programiranje
61008 (703) Snowflake2
»

[WPF] Vrednost Textbox kot "angle" v AxisAngleRotation3D

Oddelek: Programiranje
5724 (659) saule
»

Največje računalniške napake v zgodovini

Oddelek: Novice / Znanost in tehnologija
4715409 (12036) MrStein
»

[C++]Instanca razreda

Oddelek: Programiranje
81464 (1355) Senitel
»

[C++] Pretvorba iz int v char *

Oddelek: Programiranje
232893 (2269) Gundolf

Več podobnih tem