Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

19.05.2011, 16:58

Parameterliste und template

hi leute hab da ein Problem oder besser eine Frage.
Ich arbeite mit xml(mit der tinyxml lib) und vreusch gerade eine kleine hilfs funktion zu schreiben.
Die 1. ist mir gelungen (war ja auch nicht schwer)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename T>
void setElement(TiXmlElement* pElem,std::string elemName,std::string valueName,T value){
if(!pElem)
    return;

TiXmlElement pElemChild = TiXmlElement (elemName);
pElemChild.SetAttribute(valueName,typeToStr<T>(value));
pElem->InsertEndChild(pElemChild);
}

void getElement(TiXmlElement* pElem,std::string elemName,std::string valueName,double& value);
void getElement(TiXmlElement* pElem,std::string elemName,std::string valueName,float& value);
void getElement(TiXmlElement* pElem,std::string elemName,std::string valueName,int& value);
void getElement(TiXmlElement* pElem,std::string elemName,std::string valueName,std::string& value);

void getElement(TiXmlElement* pElem,std::string elemName,std::string valueName,double& value){
TiXmlElement* pElemChild = pElem->FirstChildElement(elemName.c_str());
if(pElemChild)
    pElemChild->QueryDoubleAttribute(valueName.c_str(),&value);
}

so weit so gut
Mein Problem ist jetzt aber was ist wenn ich ein Element hab das 2,3,4 oder 5 Attribute hat, will ich nicht jetzt 30 Funktionen schreiben

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
template<typename T,typename T2>
void setElement(TiXmlElement* pElem,std::string elemName,std::string valueName,std::string valueName2,T value,T2 value2){
if(!pElem)
    return;

TiXmlElement pElemChild = TiXmlElement (elemName);
pElemChild.SetAttribute(valueName,typeToStr<T>(value));
pElemChild.SetAttribute(valueName2,typeToStr<T2>(value2));
pElem->InsertEndChild(pElemChild);
}

//...


könnte die Funktion nicht so aussehen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Foo{
   public:
   int a;
   double b;
   float c;
}

void setElement(TiXmlElement* pElem,std::string elemName,std::string valueNames,...){
...
}

void getElement(TiXmlElement* pElem,std::string elemName,std::string valueNames,...){
 ...
 }

setElement(pElem,"Foo","a b c",foo.a,foo.b,foo.c);
getElement(pElem,"Foo","a b c",&foo.a,&foo.b,&foo.c);

Quellcode

1
<Foo a="5" b="25.6589" c="12.56"/>


Hab auch schon nach stdarg.h geguckt, weis aber nicht wie ich das umsetzen kann.
So wie ich das verstanden hab braucht va_arg() noch den datentypen als parameter
aber woher soll ich wissen welche datentype das aktuelle argument hat.
Den Datentyp braucht ich ja auch für T(vom template).

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

19.05.2011, 17:24

Den Typen kannst du (wie es printf macht) aus dem String holen.
Siehe z.B auch hier:
http://www.cppreference.com/wiki/c/other/va_arg

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

3

19.05.2011, 17:27

Also ich empfehle dir einfach eine std::map<std::string, std::string>(Argumente werden schon vorher in einen vernünftigen String-Wert umgewandelt, der schließlich ja auch in das Element geschrieben werden soll) zu verwenden. Dann schreibst du alle Elemente aus der Map in die XML-Datei und fertig.
Das ist eine deutlich schönere Lösung als mit beliebigen Argumenten zu arbeiten.

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

4

19.05.2011, 17:57

auch n nette idee, die argumente in strings umzu wandeln is ja nicht so schwer.
Aber wie sieht es umgekert aus wenn ich den String wieder auslesesn will dann hab ich doch verschiedene typen.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

19.05.2011, 18:11

Das Problem ist, dass du diese Typinformationen kennen musst. Denn aus einem XML-File bekommst du erst mal nur Strings. Folglich musst du entweder die Typinformationen mit abspeichern oder einfach beim Auslesen wissen, was der entsprechende String zu sein hat.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

19.05.2011, 19:04

Mit C++0X gibt es doch auch variadic templates. Die wären eine Lösung. Ansonsten gibt es noch einige böse metaprogrammierungstricks die u.a. in boost python eingesetzt wird, wenn ich mich recht erinnere.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige