Добрый день всем. Хочу сделать некое подобие методанных. То есть иметь в классе статический метод, который возвращает допустим размер поля или структуру с этими размерами. Но не получается. Вот код, например:
struct a
{
int i;
char j;
static int so() {return sizeof(i);}
};
Если слово static убрать все работает. Но со словом static пишет " error C2070: '': illegal sizeof operand ". Что не так? Неужели размер класса еще не известен и из-за этого все проблемы? Но вот так тоже не работает:
struct a
{
int i;
char j;
static int so();
};
int a::so() {return sizeof(i);}
Подскажите как быть, а то зашел в тупик. Надо сделать именно со static
Путем эксперементов получилось если сделать так:
struct a
{
public:
int i;
char j;
static int so() {return sizeof(((a*)0)->i);}
};
Это корректно?
Здравствуйте, PavelCH, Вы писали:
PCH>Добрый день всем. Хочу сделать некое подобие методанных. То есть иметь в классе статический метод, который возвращает допустим размер поля или структуру с этими размерами. Но не получается. Вот код, например:
PCH>...
PCH>Если слово static убрать все работает. Но со словом static пишет " error C2070: '': illegal sizeof operand ". Что не так? Неужели размер класса еще не известен и из-за этого все проблемы? Но вот так тоже не работает:
PCH>...
PCH>int a::so() {return sizeof(i);}
PCH>[/c#]
PCH>Подскажите как быть, а то зашел в тупик. Надо сделать именно со static
Можно сделать универсальное приспособление в виде предварительного объявления шаблонной функции следующего вида:
template<typename T, typename ClassT>
T value_of(T (ClassT::*mem_ptr));
Теперь с помощью этого приспособления можно получать размеры членов классов:
struct a
{
int i;
char j;
class Any* ptr;
static int so() { return sizeof(value_of(&a::i)); }
};
Что приятно, размеры членов можно получать как константы времени компиляции:
enum
{
sizeof_a_i = sizeof(value_of(&a::i)),
sizeof_a_j = sizeof(value_of(&a::j)),
sizeof_a_ptr = sizeof(value_of(&a::ptr))
};
Здравствуйте, PavelCH, Вы писали:
PCH>Путем эксперементов получилось если сделать так:
PCH>PCH>struct a
PCH>{
PCH>public:
PCH> int i;
PCH> char j;
PCH> static int so() {return sizeof(((a*)0)->i);}
PCH>};
PCH>
PCH>Это корректно?
Ни в коем случае. Верный вариант rg45 написал
здесьАвтор: rg45
Дата: 28.11.09
.
Здравствуйте, rg45, Вы писали:
R>...
R>Теперь с помощью этого приспособления можно получать размеры членов классов:
R>...
R>Что приятно, размеры членов можно получать как константы времени компиляции:
R>...
Сижу теперь и ржу
wander:
PCH>>Путем эксперементов получилось если сделать так:
PCH>>PCH>>struct a
PCH>>{
PCH>>public:
PCH>> int i;
PCH>> char j;
PCH>> static int so() {return sizeof(((a*)0)->i);}
PCH>>};
PCH>>
PCH>>Это корректно?
W>Ни в коем случае.
Это ещё почему? Такой вариант тоже вполне корректен.
Здравствуйте, Николай Ивченков, Вы писали:
НИ>Это ещё почему? Такой вариант тоже вполне корректен.
Да это у меня рефлекс сработал на приведение нуля. Я б сам себе минус поставил, если б мог