8 votes

C++ typename de la variable membre

Est-il possible d'obtenir le typename d'une variable membre ? Par exemple :

struct C { int value ; };

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

Merci

9voto

GManNickG Points 155079

Pas dans C++03. C++0x introduit decltype :

typedef decltype(C::value) type;

Certains compilateurs ont un typeof l'extension, cependant :

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

Si vous êtes d'accord avec Boost, ils ont un bibliothèque pour cela :

typedef BOOST_TYPEOF(C::value) type;

5voto

Seulement si vous êtes d'accord pour traiter le type dans une fonction.

struct C { int value ; };

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

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

Cela ne fonctionnera pas avec les membres des données de référence. C++0x permettra decltype(C::value) pour le faire plus facilement. Non seulement cela, mais cela permet decltype(C::value + 5) et toute autre expression fantaisiste à l'intérieur du decltype . Gcc4.5 le supporte déjà.

1voto

Chris Lutz Points 34157

Ce n'est peut-être pas exactement ce que vous recherchez, mais c'est peut-être une meilleure solution à long terme :

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

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

Ce n'est pas exactement ce que vous voulez, mais cela nous permet de masquer le type d'implémentation de la fonction C::value afin que nous puissions le modifier ultérieurement, ce qui est ce que je soupçonne que vous recherchez.

0voto

stefanB Points 27796

Cela dépend de ce que vous devez faire avec, mais vous feriez quelque chose comme.. :

#include <iostream>
using namespace std;

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

int main()
{
    C::VType a = 3;
    cout << a << endl;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X