Списки инициализаторов у построек есть два убийственных недостатка:
- Они безымянны; если у меня есть десяток однотипных параметров (цвета элементов пользовательского интерфейса), в них легко запутаться; трудно понять, что означает каждый из них, а комментарии не помогают и даже могут ввести в заблуждение из-за (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;
}
Код: Выделить всё
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 }
};
}
Код: Выделить всё
#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]