Wektor z szablonu

0

Witam!
Mam taką klasę:

template <typename _typ>
class Atrybut {

private:

...

_typ wartosc;

...

}

I teraz w programie potrzebuję zrobić vector elementów typu Atrybut, ale różnych typów.
Jak to zrobić?

1

Nie bardzo rozumiem.

vector<Atrybut<int>>

?

0

Chodzi o to, zeby vector wyglądał w taki sposób:

["Imie"]
[1751]   //int
[161.788]  //float
['k'] //char

,a vector vector<Atrybut<int> > bedzie wygladał:

[1236]
[23472]
[2134]
1

Nie da się czegoś takiego zrobić. Atrybut<int> oraz Atrybut<float> to zupełnie inne typy. Możesz kombinować z uniami, albo wszystko trzymać w std::string i konwertować kiedy potrzeba...

1
Endrju napisał(a):

...Możesz kombinować z uniami, albo wszystko trzymać w std::string i konwertować kiedy potrzeba...
albo po ludzku użyć polimorfizmu - w wektorze trzymać wskaźniki do obiektów o wspólnej bazie.

0
adf88 napisał(a):
Endrju napisał(a):

...Możesz kombinować z uniami, albo wszystko trzymać w std::string i konwertować kiedy potrzeba...
albo po ludzku użyć polimorfizmu - w wektorze trzymać wskaźniki do obiektów o wspólnej bazie.

W takim razie w Bazie będą potrzebne metody wirtualne, a szablony nie mogą być funkcjami wirtualnymi.
Chyba, że inaczej to rozumiesz? Albo ja źle rozumuję.

//No chyba, że zmienna będzie publiczna i ją zastąpię w pochodnej typem _typ, ale wtedy nie mam getValue(), tylko odwołuję się do zmiennej bezpośrednio element.zmienna

1
adf88 napisał(a):

albo po ludzku użyć polimorfizmu - w wektorze trzymać wskaźniki do obiektów o wspólnej bazie.

A metoda get w klasie bazowej jak będzie wyglądać?

0

template<typename _typ="_typ">
virtual _typ get() {return wartosc;}

1
kumek napisał(a):

template<typename _typ="_typ">
virtual _typ get() {return wartosc;}

Jak chcesz zrobić szablonową metodę wirtualną?

1
Endrju napisał(a):

A metoda get w klasie bazowej jak będzie wyglądać?
Jaka metoda get? Nie wiem czy dobrze rozumiem, ale chodziło mi o polimorfizm czyli o operowanie na obiektach poprzez wspólny interfejs metod wirtualnych, niezależny od parametru T.

1
adf88 napisał(a):

Jaka metoda get? Nie wiem czy dobrze rozumiem, ale chodziło mi o polimorfizm czyli o operowanie na obiektach poprzez wspólny interfejs metod wirtualnych, niezależny od parametru T.

Chodzi o to, że on chce aby wektor przechowywał "jakieś" elementy, które będą trzymać pola rożnych typów. Nazwa "Atrybut" sugeruje, że jest jakieś coś, co ma np. takie atrybuty: długość (liczba), nazwa (napis). Jeden wektor ma trzymać te atrybuty i umożliwiać do nich dostęp. Polimrofizm moim zdaniem na niewiele się tu zda, bo metoda zwracające te wartości musi umieć zwracać różne typy, a to nie jest możliwe. Szablony z kolei nie pozwolą na trzymanie atrybutów w jednym wektorze.

1

Może coś takiego?

#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct Base
  {
   virtual ostream &out(ostream &s)const=0;
   virtual ~Base() {}
  };
ostream &operator<<(ostream &s,const Base &B) { return B.out(s); }

template <typename _typ> class Atrybut:public Base
  {
   private:
   _typ wartosc;
   public:
   Atrybut(_typ wartosc=_typ()):wartosc(wartosc) {}
   virtual ostream &out(ostream &s)const { return s<<wartosc; }
  };

int main()
  {
   vector<Base*> Tb;
   Tb.push_back(new Atrybut<int>(1));
   Tb.push_back(new Atrybut<double>(2.2));
   Tb.push_back(new Atrybut<string>("Ala ma kota"));
   for(vector<Base*>::iterator i=Tb.begin();i!=Tb.end();++i) cout<<**i<<' ';
   for(vector<Base*>::iterator i=Tb.begin();i!=Tb.end();++i) delete *i;
   cin.sync();
   cin.get();
   return 0;
  }
0

Chodzi tutaj o atrybuty z języka XML i ostatecznie przestałem kombinować i ostatecznie nazwę i wartość zapisuję jako string. Do zapisu i odczytu z pliku wystarczy, a w razie potrzeby będę konwertował na potrzebne typy.

Dzięki za pomoc.

0

Użyj gotowej biblioteki. Do XML jest ich trochę.

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