LINUX.ORG.RU

Как жить без designated initializers?

 


0

1

Если инициализировать поля в порядке объявления, то будет нечитаемо, легко ошибиться и нельзя пропускать поля.

Если с помощью конструктора, то ему все равно надо передавать параметры, а они безымянные. К тому же это динамика.

Может есть еще способы?

designated initializers (не знаю, как по-русски) - это

struct A {
  int a, b, c;
} a = { .a = 1, .c = 2 }; /* a.b == 0 */

★★★★

Последнее исправление: unsigned (всего исправлений: 1)

Подумалось, что вроде в С++11 добавили такое, но вот мельком пробежался по описанию нововведений стандарта и не нашел такого, либо я слепой, либо и правда не добавили.

hippi90 ★★★★★
()
Ответ на: комментарий от namezys

а знаешь, когда вызываешь функцию, тоже можно ошибится

Поэтому в приличных языках есть именованные параметры %)

tailgunner ★★★★★
()
Ответ на: комментарий от namezys

а знаешь, когда вызываешь функцию, тоже можно ошибится

А еще можно ошибиться с выбором языка. Например, если выбрать С++ в 2012 году.

Да и в написании слова «ошибиться» некоторые умудряются накосячить.

anonymous
()
Ответ на: комментарий от namezys

когда вызываешь функцию, тоже можно ошибится

Вот только функция с десятью параметрами - это бред, а структура с десятью полями - норма.

unsigned ★★★★
() автор топика
Ответ на: комментарий от vaino

Это, как я понимаю, просто сахар для

struct A {
  int a, b, c;
  A(): a(1), b(0), c(2) {}
} a;
Тогда не совсем то - нельзя для каждого объекта выполнить свою инициализацию.

unsigned ★★★★
() автор топика
Ответ на: комментарий от unsigned

Хотя, конечно, можно наследоваться:

struct A_b: public A {
  A_b():
    a(5),
    c(6)
  {}
} b;
Но что-то такой вариант не радует. И все равно динамика.

unsigned ★★★★
() автор топика
Ответ на: комментарий от namezys

структура, которую надо инициализировать 10 параметрами, тоже подозрительна

Да нет, бывает - дескрипторы всякие. У меня в проекте дескриптор объекта из восьми полей, и их еще прибудет как минимум наполовину.

unsigned ★★★★
() автор топика
Ответ на: комментарий от unsigned

Например? За одно и то, как их инициализируешь.

Если там код типа

struct A {
  int a;
  int b;
  int c;
};

...

void f(C c, D d)
{
  A a;
  a.a = c.a;
  a.b = d.a;
  a.c = c.b + d.b;
}

То может стоит инициализировать их именно этими структурами?

namezys ★★★★
()
Ответ на: комментарий от tailgunner

в приличных языках есть именованные параметры

Во, так ведь даже в C можно их эмулировать:

f((struct f_args){ .a = 1, .b = 2 });
А в C++ нельзя :|

unsigned ★★★★
() автор топика
Ответ на: комментарий от namezys

Не совсем понял. Это глобальные структуры, инициализируются статично, например:

static const struct UType __type = {
	.vtbl = __vtbl,
	.vtbl_count = sizeof(__vtbl) / sizeof(__vtbl[0]),
	.name = "UString",
	.size = sizeof(struct UString),
	.ctor = ustring_new,
	.dtor = ustring_delete,
};

unsigned ★★★★
() автор топика
Ответ на: комментарий от vaino

тот же минус Если только так

[code] template<int v> struct A { int a = v; }; template<int v> struct B { int b = v; }; struct C : A<1>, B<1> {}; [/code]

но потом будут одни шаблоны

namezys ★★★★
()
Ответ на: комментарий от unsigned

Ой. Боже мой.

Хотя если это инициализируется один раз - то можно и конструктор. Если много - то функцию.

namezys ★★★★
()
#include <cstdio>
#define FACTORY_A( ... ) []{ struct A_ : public A { A_(){ __VA_ARGS__; } } a; return a; }();

struct A {
   int a, b, c;
};

static A gA = FACTORY_A( a=1, b=2 );

int main() {
    printf( "%d\n", gA.a );
}

вот подходящий костыль, gcc оптимизирует на ура

vaino
()
Ответ на: комментарий от vaino
#include <cstdio>
#define FACTORY( T, ... ) []{ struct T_ : public T { T_(){ __VA_ARGS__; } } r; return r; }();

struct A {
   int a, b, c;
};

static A gA = FACTORY( A, a=1, b=2 );

int main() {
    printf( "%d\n", gA.a );
}

можно даже сделать его универсальным

vaino
()
Ответ на: комментарий от anonymous

и не говори, сам таким бы точно не пользовался

vaino
()

Структурам можно делать конструкторы. Конструкторы могут принимать аргументы. Аргументы могут иметь значения по-умолчанию.

</thread>

yoghurt ★★★★★
()
Ответ на: комментарий от vaino

Какая жуть... Но что-то в этом есть )

unsigned ★★★★
() автор топика
Ответ на: комментарий от anonymous

В C структура инициализируется во время компиляции, а при использовании конструктора - в рантайме, что лишне.

Но главная проблема в неименованности аргументов.

unsigned ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.