c++ typ zur compilezeit ermitteln

OP #1585098
Hi,

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

Ich habe folgende Klassenkombination:
1
class A;
2

3
template<class T> class B : A
4
{
5
public:
6
  explizit B(T& v);
7
}

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

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

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

-> geht leider nicht, da das Template fehlt.

was geht ist:
1
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:
1
A* pa = new B<typeof(u1)>(u1);

dann könnte man auch ein Makro anlegen
1
#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
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.
Vlad Tepesch schrieb:
> Was ich suche ist so etwas wie:A* pa = new B<typeof(u1)>(u1);

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

3
class Basisklasse
4
{
5
public:
6

7
  virtual void zeigdich()
8
  {
9
  }
10
};
11

12
template < typename T > class Klasse: public Basisklasse
13
{
14
public:
15
  Klasse( const T &wert )
16
    : wert( wert )
17
  {
18
  }
19

20
  virtual void zeigdich()
21
  {
22
    std::cout << "wert = " << wert << std::endl;
23
  }
24

25
private:
26

27
  T     wert;
28

29
};
30

31

32

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

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

41
  k.zeigdich();
42
  p1->zeigdich();
43
  p2->zeigdich();
44

45
}

ergibt bei mir:
1
klaus@a64a:~ > g++ -Wall t.cpp && ./a.out
2
wert = 42
3
wert = 42
4
wert = 42
5
klaus@a64a:~ > g++ -v
6
Using built-in specs.
7
Target: i486-linux-gnu
8
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
9
Thread model: posix
10
gcc version 4.3.2 (Debian 4.3.2-1.1)
Gast
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.