c++ не имеет такого же гибкого члена массива, как последний элемент, как c99. Вы должны использовать std::vector
, если вы не знаете, сколько элементов, или вы должны указать, сколько, если знаете.
EDIT: в своем редактировании вы сказали, что массив является константой времени выполнения, поэтому укажите размер, и он должен работать нормально. g++ не имеет проблем со следующим кодом:
struct TestStruct { // note typedef is not needed */
int length;
int values[3]; // specified the size
};
TestStruct t = {3, {0, 1, 2}};
int main() {
// main implicitly returns 0 if none specified
}
EDIT: чтобы ответить на ваш комментарий, вы можете использовать такие шаблоны:
template <int N>
struct TestStruct {
int length;
int values[N];
};
TestStruct<3> t3 = {3, {0, 1, 2}};
TestStruct<2> t2 = {2, {0, 1}};
int main() {}
Единственная проблема заключается в том, что нет простого способа поместить как t2, так и t3 в контейнер (например, список/вектор/стек/очередь/и т. д., потому что они имеют разные размеры. Если вы хотите этого, вы должны использовать std::vector
. Кроме того, если вы делаете это, тогда нет необходимости хранить размер (он связан с типом), поэтому вы можете сделать это вместо этого:
template <int N>
struct TestStruct {
static const int length = N;
int values[N];
};
TestStruct<3> t3 = {{0, 1, 2}};
TestStruct<2> t2 = {{0, 1}};
int main() {}
Но опять же, вы не можете легко собрать t2 и t3 в «коллекцию».
РЕДАКТИРОВАТЬ: В общем, похоже, что вам (если вы не храните больше данных, чем просто некоторые числа и размер) вообще не нужна структура, и вы не можете просто использовать простой старый вектор .
typedef std::vector<int> TestStruct;
int t2_init[] = { 0, 1, 2 };
TestStruct t3(t3_init, t3_init + 3);
int t2_init[] = { 0, 1 };
TestStruct t2(t2_init, t2_init + 2);
int main() {}
Что позволит вам иметь как t2, так и t3 в коллекции вместе. К сожалению, std::vector
(пока) не имеет синтаксиса инициализатора в стиле массива, поэтому я использовал ярлык. Но достаточно просто написать функцию для красивого заполнения векторов.
EDIT: Итак, вам не нужна коллекция, но вам нужно передать ее функции, вы можете использовать для этого шаблоны, чтобы сохранить безопасность типов!
template <int N>
struct TestStruct {
static const int length = N;
int values[N];
};
TestStruct<3> t3 = {{0, 1, 2}};
TestStruct<2> t2 = {{0, 1}};
template <int N>
void func(const TestStruct<N> &ts) { /* you could make it non-const if you need it to modify the ts */
for(int i = 0; i < N; ++i) { /* we could also use ts.length instead of N here */
std::cout << ts.values[i] << std::endl;
}
}
// this will work too...
template <class T>
void func2(const T &ts) {
for(int i = 0; i < ts.length; ++i) {
std::cout << ts.values[i] << std::endl;
}
}
int main() {
func(t2);
func(t3);
func2(t2);
}
person
Evan Teran
schedule
16.04.2010
typedef
ed. Хотя, учитывая, что вы пометили вопрос как C++, я не понимаю, зачем вам вообще это делать. Структуры определения типов использовались для преодоления ограничения C (в отличие от C++), где нельзя было объявить структурную переменную без ключевого слова ненужногоstruct
. - person Hi-Angel   schedule 30.11.2017