Хочу получить размер свойства, что не так написал?
От: PavelCH  
Дата: 28.11.09 18:34
Оценка: :)
Добрый день всем. Хочу сделать некое подобие методанных. То есть иметь в классе статический метод, который возвращает допустим размер поля или структуру с этими размерами. Но не получается. Вот код, например:

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
Нехай щастить
Re: Хочу получить размер свойства, что не так написал?
От: PavelCH  
Дата: 28.11.09 18:41
Оценка:
Путем эксперементов получилось если сделать так:

struct a
{
public:
    int        i;
    char    j;
    static int so() {return sizeof(((a*)0)->i);}
};


Это корректно?
Нехай щастить
Re: Хочу получить размер свойства, что не так написал?
От: rg45 СССР  
Дата: 28.11.09 19:39
Оценка: 4 (1)
Здравствуйте, 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))
};
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Хочу получить размер свойства, что не так написал?
От: wander  
Дата: 28.11.09 20:58
Оценка:
Здравствуйте, 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
.
Re[2]: Хочу получить размер свойства, что не так написал?
От: rg45 СССР  
Дата: 28.11.09 21:23
Оценка: :))) :)
Здравствуйте, rg45, Вы писали:

R>...

R>Теперь с помощью этого приспособления можно получать размеры членов классов:
R>...
R>Что приятно, размеры членов можно получать как константы времени компиляции:
R>...

Сижу теперь и ржу
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: Хочу получить размер свойства, что не так написал?
От: Николай Ивченков  
Дата: 28.11.09 21:49
Оценка: 2 (2) +3
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>Ни в коем случае.


Это ещё почему? Такой вариант тоже вполне корректен.
Re[4]: Хочу получить размер свойства, что не так написал?
От: wander  
Дата: 30.11.09 20:41
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

НИ>Это ещё почему? Такой вариант тоже вполне корректен.


Да это у меня рефлекс сработал на приведение нуля. Я б сам себе минус поставил, если б мог

Re: N2253
От: Alexander G Украина  
Дата: 06.12.09 16:19
Оценка:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.