Как инициализировать структуры, используя имена полей?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как инициализировать структуры, используя имена полей?

Сообщение Anonymous »

Я хочу инициализировать множество разных объектов определенного типа (структуры) с разными значениями для их полей, и я хочу использовать имена для инициализации, чтобы сделать код читабельным и надежным.
Списки инициализаторов у построек есть два убийственных недостатка:
  • Они безымянны; если у меня есть десяток однотипных параметров (цвета элементов пользовательского интерфейса), в них легко запутаться; трудно понять, что означает каждый из них, а комментарии не помогают и даже могут ввести в заблуждение из-за (2).
  • Порядок полей структуры определяется установленным контрактом (или API, или интерфейсом). ); если завтра разработчик изменит порядок полей (лучшее размещение в памяти, более частое использование, алфавитный порядок и т. д.), он испортит все списки инициализаторов со значениями одного и того же типа на непредсказуемом далеке места кода, которые довольно сложно найти, даже если вы поняли, что произошло.

Вот задача, которую я пытаюсь выполнить решить. У меня есть конфигурация приложения, которую в данном конкретном случае я не хочу помещать во внешний файл и хочу скомпилировать. Это очень близко к тому, как определить структуру C++ для конфигурации?, но я не готов помещать часто меняющиеся параметры в заголовочный файл и вызывать перекомпиляцию всего приложения при каждом изменении значения в исходном коде параметров (спецификация или проект НИОКР, много вещей, которые нужно часто настраивать). Итак, я поместил фактические значения в файл cpp.
Давайте рассмотрим код (пожалуйста, не зацикливайтесь на конкретном примере, цвета пользовательского интерфейса здесь просто для простоты примера):
params.h

Код: Выделить всё

struct RGB { unsigned char r=0, g=0, b=0; };

struct UIColors {
RGB background;
RGB font;
};

namespace params {
extern bool ui_bright_mode;

extern UIColors night_mode;
extern UIColors bright_mode;
}
params.cpp

Код: Выделить всё

namespace params {
bool ui_bright_mode = 1;

UIColors night_mode  = {
/*background*/ {1, 1, 1},
/*font*/ {0, 0, 200}
};

UIColors bright_mode = {
/*background*/ { 255, 255, 255 },
/*font*/ { 50, 50, 50 }
};
}
application.cpp

Код: Выделить всё

#include 

UIColors& ui_colors() {
return params::ui_bright_mode ? params::bright_mode : params::night_mode;
}

int main()
{
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79367716/how-to-initialize-structures-using-fields-names[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»