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


von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Bri (bri)


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.

von Bri (bri)


Lesenswert?

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

von Vlad T. (vlad_tepesch)


Lesenswert?

stimmt, das wär eine gute Möglichkeit.
Danke!

von Klaus W. (mfgkw)


Lesenswert?

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)

von Vlad T. (vlad_tepesch)


Lesenswert?

hab ich probiert, kennt er angeblich nicht

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

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.