[BCB]return type variabel (template?)

Pagina: 1
Acties:

  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
Ik wil gewoon voor mijzelf een soort handler maken voor het uitlezen van bepaalde datatypen uit bepaalde objecten zoals een TEditBox...

Nu weet ik dat je met een template functie de return waarde kan kan bepalen, maar daar zit 1 probleempje aan... Dat desbetreffende datatype moet bepaald zijn in de argumenten van de functie... (Anders weet de functie immers niet wat voor een datatype hij moet returnen)

Dit vind ik een beetje "statisch" als het ware... Want het moment dat jij zegt:

Type varnaam = functie(argumenten); weet de funtie in feite al wat hij moet leveren.

Stel ik wil het volgende doen:

C++:
1
2
3
4
5
6
7
8
9
10
template <typename T> T LeesEditBox(TEdit* Edit, String Type /*etc. etc..*/)
{
       if(Type="String")
          // doe de string handling
       return String;
       else if (Type = "int")
          // doe de int handling
        return int;
       // etc etc etc
}


Uiteraard klopt dit voor geen ene meter... Het is slechts een indicatie wat betreft hoe ik het zou willen.

Bestaat er nou een manier om typename T toch de definieren zonder het mee te hoeven te geven in één van de argumenten?
En indien niet, kan ik dan met een typename T argument een operatie uitvoeren als

C++:
1
2
3
4
5
6
7
template <typename T> T LeesEditBox(TEdit* Edit,T Type /*etc. etc..*/)
{
          if(Type.IsInt)
          //int handler
            return int;
        // etc etc etc
}

We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Natuurlijk moet een Template van te voren weten welk soort type het wordt. Een template is een compile time structure (in Java iig!).
Wat jij echter wilt kun je stukken beter met interfaces aan te pakken. Je returned dan een class die de interface implementeert en je overige code spreekt gewoon de interface aan.

Echter het willen returnen van verschillende types duid op een slecht ontwerp. Kijk daar eerst maar eens naar voordat je alllemaal trucs gaat uitvoeren :)

Verwijderd

Er zijn hier hele vieze truukjes voor.. je kunt bv een union in pakken in een struct waarvan het struct dan weer aangeeft op welk type de union is (kijk maar eens naar het type VARIANT van MS) .... mogelijk zou je een void pointer kunnen gebruiken ipv van union... echter qua design krijg dit waarschijnlijk wel een dikke 0... ik denk niet dat je het echt wilt gebruiken

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 21 December 2002 @ 10:42:
Er zijn hier hele vieze truukjes voor.. je kunt bv een union in pakken in een struct waarvan het struct dan weer aangeeft op welk type de union is (kijk maar eens naar het type VARIANT van MS) .... mogelijk zou je een void pointer kunnen gebruiken ipv van union... echter qua design krijg dit waarschijnlijk wel een dikke 0... ik denk niet dat je het echt wilt gebruiken
Ik denk het ook niet ;) Je moet gewoon gebruikmaken van polymorfisme zoals glimi al vertelde.

code:
1
2
3
4
5
6
7
8
9
10
11
class Handler{
     abstract void handle(String s);
}

class IntHandler extends Handler{
        int uitkomst;
       void handle(String s){
            //controleer of s een int is en geef desnoods een foutmelding
            uitkomst = stringToInt(s);
      }
}


Nu kun je dus handlers maken voor verschillende types en die meegeven.

[ Voor 25% gewijzigd door Alarmnummer op 21-12-2002 11:14 ]


  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
Glimi schreef op 21 december 2002 @ 10:24:
Natuurlijk moet een Template van te voren weten welk soort type het wordt. Een template is een compile time structure (in Java iig!).
Wat jij echter wilt kun je stukken beter met interfaces aan te pakken. Je returned dan een class die de interface implementeert en je overige code spreekt gewoon de interface aan.

Echter het willen returnen van verschillende types duid op een slecht ontwerp. Kijk daar eerst maar eens naar voordat je alllemaal trucs gaat uitvoeren :)
Slecht ontwerp? Je bedoelt: welk ontwerp... :P

Nee ik wil gewoon een stukje functionele code... lekker compact, en makkelijk.
Alarmnummer schreef op 21 december 2002 @ 11:10:
[...]

Ik denk het ook niet ;) Je moet gewoon gebruikmaken van polymorfisme zoals glimi al vertelde.

C++:
1
2
3
4
5
6
7
8
9
10
11
class Handler{
     abstract void handle(String s);
}

class IntHandler extends Handler{
        int uitkomst;
       void handle(String s){
            //controleer of s een int is en geef desnoods een foutmelding
            uitkomst = stringToInt(s);
      }
}


Nu kun je dus handlers maken voor verschillende types en die meegeven.
Hmmmmmmm dit moet ik even rustig aan proberen en bestuderen....
Nog niet echt met nieuwe classes gewerkt.. tenminste niet die als handlers fungeren.

[ Voor 36% gewijzigd door WarMaster op 21-12-2002 13:31 ]

We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

WarMaster schreef op 21 december 2002 @ 13:29:
Nee ik wil gewoon een stukje functionele code... lekker compact, en makkelijk.
Variants. Lekker makkelijk. Kan je alles in stoppen en uithalen. Ook array's. Wel heel vies en ruikt naar VB/PHP

We adore chaos because we like to restore order - M.C. Escher


  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
LordLarry schreef op 21 december 2002 @ 13:33:
[...]

Variants. Lekker makkelijk. Kan je alles in stoppen en uithalen. Ook array's. Wel heel vies en ruikt naar VB/PHP
Klinkt ok...
Alleen dat brakke borland help gebeuren gaat dan weer lopen gooien met voorbeeld code in Object Pascal |:(

Ik zou toch zweren dat ik een C++ builder had gekocht....

We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.

Pagina: 1