mikrocontroller.net

Forum: PC-Programmierung c++ typ zur compilezeit ermitteln


Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

vielleicht kennt ja jemand dafür eine Lösung:

Ich habe folgende Klassenkombination:
class A;

template<class T> class B : A
{
public:
  explizit B(T& v);
}


B ist eine Art containerobjekt, dem man eine Variable übergibt.

an anderer Stelle werden Variablen angelegt
uint32_t  u1;
float32_t f1;

Nun soll mit diesen ein Objekt vom typ B angelegt werden:
A* pa = new B(u1);

-> geht leider nicht, da das Template fehlt.

was geht ist:
A* pa = new B<uint32_t>(u1);

was mich hierbei stört ist, dass der Typ von u1 an verschiedenen Stellen 
im Code erforderlich ist -> Fehleranfälligkeit bei Änderungen.

Was ich suche ist so etwas wie:
A* pa = new B<typeof(u1)>(u1);

dann könnte man auch ein Makro anlegen
#define BOBJ(v) B<typeof(v)>(v)


hat jemand eine Idee, wie das zu bewerkstelligen wäre.


Ach so: ich benutze VS 2005


Gruß,
Vlad

Autor: T. B. (bri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst eine create-Funktion mit einem template Parameter schreiben, 
ähnlich wie das make_pair. Das hätte nur den Nachteil, das du die 
Objekte immer mit dieser Funktion anlegen müsstest. Das das auch jeder 
macht kannste sicherstellen, indem du den Konstruktor privat machst und 
die Funktion als friend deklarierst.

Autor: T. B. (bri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eleganter wäre vielleicht, anstelle der Funktion eine statische member 
template zu schreiben, so dass du die Objekte in der Art erzeugen 
kannst:
obj = A::create(u1);

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, das wär eine gute Möglichkeit.
Danke!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> Was ich suche ist so etwas wie:A* pa = new B<typeof(u1)>(u1);

und schon mal mit typeof probiert?
#include <iostream>

class Basisklasse
{
public:

  virtual void zeigdich()
  {
  }
};

template < typename T > class Klasse: public Basisklasse
{
public:
  Klasse( const T &wert )
    : wert( wert )
  {
  }

  virtual void zeigdich()
  {
    std::cout << "wert = " << wert << std::endl;
  }

private:

  T     wert;

};



int main(int argc, char* argv[])
{
  int i = 42;
  Klasse< int > k( i );

  Basisklasse  *p1 = new Klasse< int >( i );
  Basisklasse  *p2 = new Klasse< typeof(i) >( i );

  k.zeigdich();
  p1->zeigdich();
  p2->zeigdich();

}

ergibt bei mir:
klaus@a64a:~ > g++ -Wall t.cpp && ./a.out
wert = 42
wert = 42
wert = 42
klaus@a64a:~ > g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1.1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-cld --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1) 

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab ich probiert, kennt er angeblich nicht

__typeof highlighted er zwar, kennt er dann aber angeblich auch nicht.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist auch kein Standard-C++, sondern eine unportable 
Compilererweiterung.

T. B. schrieb:

> Das dDas hätte nur den Nachteil, das du die Objekte immer mit dieser
> Funktion anlegen müsstest. as auch jeder macht kannste sicherstellen,
>indem du den Konstruktor privat machst und die Funktion als friend
> deklarierst.

Das ist aber eigentlich gar nicht nötig, schließlich ist es ja kein 
Problem, wenn einer ohne die Funktion das Objekt erzeugt. Er muß halt 
dann die Template-Argumente selber angeben, wenn er keinen Fehler 
bekommen will.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.