c++ typ zur compilezeit ermitteln

OP #1585098
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
#1585122
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.
#1585177
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)
Gast #1585255
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren