Frage

Ist es möglich, Typnamen einer Membervariable zu bekommen? Zum Beispiel:

struct C { int value ; };

typedef typeof(C::value) type; // something like that?

Danke

War es hilfreich?

Lösung

Nicht in C ++ 03. C ++ 0x einleitet decltype:

typedef decltype(C::value) type;

Einige Compiler haben eine typeof Erweiterung, aber:

typedef typeof(C::value) type; // gcc

Wenn Sie in Ordnung mit Boost, sie haben eine Bibliothek für sie:

typedef BOOST_TYPEOF(C::value) type;

Andere Tipps

Nur wenn Sie sind gut mit der Verarbeitung der Typ in einer Funktion

struct C { int value ; };

template<typename T, typename C>
void process(T C::*) {
  /* T is int */
}

int main() {
  process(&C::value); 
}

Es wird nicht mit Referenzdaten-Mitgliedern arbeiten. C ++ 0x ermöglicht decltype(C::value) dass leichter zu tun. Nicht nur das, sondern erlaubt es decltype(C::value + 5) und andere Phantasie Ausdruck Sachen im decltype. Gcc4.5 bereits unterstützt.

Mai nicht genau das, was Sie suchen, aber eine möglicherweise bessere Lösung auf lange Sicht:

struct C {
  typedef int type;
  type value;
};

// now we can access the type of C::value as C::type
typedef C::type type;

Dies ist nicht genau das, was Sie wollen, aber es erlaubt uns, die Umsetzung Art von C::value zu verstecken, damit wir es später ändern können, das ist, was ich vermute, du bist nach.

Es hängt davon ab, was man damit tun müssen, aber Sie würden so etwas wie:

#include <iostream>
using namespace std;

struct C
{
    typedef int VType;
    VType value;
};

int main()
{
    C::VType a = 3;
    cout << a << endl;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top