C++ typename переменной-члена


Можно ли получить typename переменной-члена? Например:

struct C { int value ; };

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

Спасибо

4 4

4 ответа:

Не в C++03. C++0x вводит decltype:

typedef decltype(C::value) type;

Некоторые компиляторы имеют расширение typeof, хотя:

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

Если вы согласны с Boost, у них есть библиотека для этого:

typedef BOOST_TYPEOF(C::value) type;

Только если вы хорошо справляетесь с обработкой типа в функции

struct C { int value ; };

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

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

Он не будет работать с элементами справочных данных. C++0x позволит decltype(C::value) сделать это более легко. Не только это, но это позволяет decltype(C::value + 5) и любой другой причудливый материал выражения в пределах decltype. Версии gcc4.5 уже поддерживает его.

Может быть не совсем то, что вы ищете, но, возможно, лучшее решение в долгосрочной перспективе:

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

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

Это не совсем то, что вы хотите, но это позволяет нам скрыть тип реализации C::value, чтобы мы могли позже изменить его, что, как я подозреваю, вам нужно.

Это зависит от того, что вам нужно сделать с ним, но вы бы сделали что-то вроде:

#include <iostream>
using namespace std;

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

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