Действительно ли возможно получить имя типа членской переменной? Например:
struct C { int value ; };
typedef typeof(C::value) type; // something like that?
Спасибо
Не в 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;
}