Szablony - jak stwierdzić jaki to typ, czy wskaźnik itd

0

Mam pytanie

mam klasę szablonową - a w niem membera

SZABLON m_zmienna_szablonowa;

i teraz jako, że mogę mieć różne typy

  • obiekt
  • wskaźnik
  • wskaźnik na wskaźnik

czyli (weźmy int)

może być

  • int
  • int *
  • int **

no i teraz w metodzie mogę sobie np dodać w zależności od tego co mam

if(obiekt)
int + int
else if(wskaźnik)
*int + *int
else if(wskaźnik na wskaźnik)
**int + **int

ale jak określić czy jest to wskaźnik czy obiekt czy coś innego?

0

Nie dasz rady na 99%, napisz po prostu specjalizacje (co jest najlepszym rozwiązaniem w takim wypadku).

Ale możesz spróbować: http://cplusplus.com/reference/std/typeinfo/type_info/

1

Nie robić tego.
Co chcesz ogólnie osiągnąć? Sposób w jaki chcesz to zrobić jest złym podejściem.

0

specjalizacja

trochę średnio mi to pasuje
w końcu od tego chciałbym mieć szablon

a tak to taki szablon tylko na obiekty - a nie na wskaźniki do nich

poza tym - taka ciekawostka - jak napiszę na forum,lepiej mi się szuka

znalazłem coś takiego

template <class T>
bool IsPointerType()
{
    return strchr(typeid(T).name(), '*') != 0;
}
// czyli jak można tak to można i tak

template <class T>

bool IsPointerToPointerType()
{
    return strchr(typeid(T).name(), '**') != 0;
}

sprawdzę czy to się nada

mam jeszcze jedno pytanie

Nie robić tego.
Co chcesz ogólnie osiągnąć? Sposób w jaki chcesz to zrobić jest złym podejściem.

Chce tym osiągnąć to, że będę miał uniwersalny szablon - albo w 99% uniwersalny - a już na pewno na tyle uniwersalny na ile potrzebuję

specjalizacji nie chcę bo w sumie szablon by wtedy pokrywał z 50% przypadków - a co gorsza do każdego nowego typu bym musiał dopisywać specjalizację dla np wskaźnika

Ale wracając do tematu - przykładowo - nie będzie problemu z rozpoznawaniem co to jest - a czy może być problem z pamięcią, chodzi mi o wycieki - porę o jakieś porady na co zwracać uwagę itp

ewentualnie o wyjaśnienie czemu to co chcę zrobić jest złe?

0

Może po prostu napisz co chcesz zrobić.

0
Rev napisał(a)

Może po prostu napisz co chcesz zrobić.

no napisałem - rozróżniać co przychodzi do szablonu - a jak już bede rozrózniał - to już będe wiedział co dalej

0

Ale jaki końcowy cel tego ma być?

0
Rev napisał(a)

Ale jaki końcowy cel tego ma być?

końcowy ma być jakiś ogólny interfejs procesu

czyli jest proces - do niego potrzebne są elementy - no i elementy jak to elementy, moga być różne

  1. ustawiam sobie na elementy procesu
  2. uruchamiam proces
  3. w procesie pobieram sobie elementy dla procesu i na nich (za ich pomocą - konfiguracje rózne) wykonuje odpowiednią akcję

no i chodzi mi o to, że jak ustawiam sobie element procesu, który może być też jakimś parametrem zwrotnym (wskaźnikiem) to chcę aby to też działało na tym samym szablonie i interfejsie

0
kalafiorowaty napisał(a)

ewentualnie o wyjaśnienie czemu to co chcę zrobić jest złe?
My prosimy o wyjaśnienie tego, co chcesz osiągnąć. Prawdopodobnie chcesz być zbyt uniwersalny.

Jeśli się uprzesz to można sprawdzić czy jakiś typ jest wskaźnikiem na poziomie kompilacji
http://stackoverflow.com/questions/301330/determine-if-type-is-a-pointer-in-a-template-function
ale 99,99% nie powinieneś tego robić.

0

Szablony funkcji są dobre do różnych typów obiektów, które dysponują wspólnym interfejsem, w twoim przypadku tak nie jest.
Co do typeid, to RTTI nie jest takie fajne jak się wydaje, zwłaszcza jak się zagłębi w sposób jaki działa. Lepiej napisz specjalizacje szablonów albo po prostu różne funkcje, bo tych szablonów to ty chcesz chyba użyć na siłę.

Tak mnie naszło że możesz zrobić jedną funkcje tylko to co do niej wysyłasz opakować klasą pośredniczącą np:

union intVariant
{
  int i;
  int * ptr;
  int ** dPtr;   
  intVariant(int _p): i(_p){}
  intVariant(int* _ptr):ptr(_ptr){}
  intVariant(int** _dPtr):dPtr(_dPtr){}
};

class myClass
{
  private:    
  intVariant myVariant;    
  unsigned char type;
  public:
  myClass(int _i): type(0), myVariant(_i){}
  myClass(int* _ptr): type(1), myVariant(_ptr){}
  myClass(int** _dPtr): type(2), myVariant(_dPtr){}          
  int get();    
};

int myClass::get()
{
  switch(type)
  {
     case 0: return myVariant.i;
     case 1: return *myVariant.ptr;           
     case 2: return **myVariant.dPtr;            
  }  
}
 

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