Re: Массив переменной длины
От: johny5 Новая Зеландия
Дата: 30.11.11 05:33
Оценка:
Здравствуйте, enji, Вы писали:

E>
E>struct Data {};
E>struct Base
E>{
E>  int sz;  
E>  Data d[1];
E>};

E>struct Der11
E>{
E>  Base b;
E>  Data d[10];
E>};

E>


E>Можно ли по стандарту так делать? А если Data будет POD? Должна ли Base быть POD? A Der11? А если в Base будет еще какой-нить double — не будет ли проблем с выравниванием?


О боже, какие страшные хаки. Вот только недавно встретил в WINAPI такое же, полчаса думал что это и как они до такого додумались. Вот откуда оказывается ноги то расли

Если вам хочется задавать кол-во элементов в зависимости от класса наследника, вот вам несколько путей:

Динамический:


struct Base
{
  std::vector<Data>  d;
};

void func()
{
  Der10 d;
  d.d.resize(10);
  doSomething(&d.b);
}



Статический:

template<int N>
struct Base
{
  Data  d[N];
};

struct Der10 : public Base<10>
{};

template<int N>
void doSomething(Base<N> *b)
{
  for (int i = 0; i < N; ++i)
  {
    std::cout << b->d[i].a << b->d[i].s << '\n';  /// *************
  }
}

void func()
{
  Der10 d;
  doSomething(&d.b);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.