Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Некоторые функции имеют одинаковый набор аргументов. КД>Хочу безопасно инициализировать глобальный экземпляр этой структуры. КД>Пишу …
А напиши ещё, почему ты считаешь, что это безопасно? А то из вопроса просто не очень ясно, чего же именно ты хочешь избежать.
КД>(я знаю что так нельзя, но вдруг уже стало можно в VS2017):
Designated initializers разшешены только в С++20 (ну и в С давным-давно ). Конечно, в clang или gcc их можно и сейчас использовать, но только как расширения С++.
Ну и точку перед именем поля нужно не забывать ставить:
Но если тебе хочется именно имя поля указывать при инициализации, то можешь использовать named parameter idiom. И это отлично комбинируется с constexpr чтобы вся работа по инициализации так и оставалась во времени компиляции.
КД>>Хочу безопасно инициализировать глобальный экземпляр этой структуры. КД>>Пишу … W>А напиши ещё, почему ты считаешь, что это безопасно? А то из вопроса просто не очень ясно, чего же именно ты хочешь избежать.
Рискну предположить, что ТС опасается, что изменив порядок полей структуры (поменяв между собой поля — указатели на одинаковый прототип функции), компиляция будет успешной, но поля будут инициализированы неправильно.
Я бы решил эту проблему инициализацией при описании самой структуры, как-то так:
Здравствуйте, EreTIk, Вы писали:
КД>>>Хочу безопасно инициализировать глобальный экземпляр этой структуры. КД>>>Пишу … W>>А напиши ещё, почему ты считаешь, что это безопасно? А то из вопроса просто не очень ясно, чего же именно ты хочешь избежать.
ETI>Рискну предположить, что ТС опасается, что изменив порядок полей структуры (поменяв между собой поля — указатели на одинаковый прототип функции), компиляция будет успешной, но поля будут инициализированы неправильно.
Да, и по этой причине тоже. Спасибо.
Еще можно натупить и при определении, перепутав порядок следования значений полей.
ETI>Я бы решил эту проблему инициализацией при описании самой структуры, как-то так: ETI>
Здравствуйте, Коваленко Дмитрий, Вы писали: КД>Не, не подходит — у меня создается два разных экземпляра этой структуры
Тогда делай через named parameter. Будешь писать так:
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Я хочу простой, понятный и безопасный способ. КД>Желательно, чтобы компилятор сразу выругался на пропущенное поле в списке инициализации.
Вам не кажется это надуманной проблемой? Или ваш код на 76% состоит из подобных инициализаций?
Если да, то сделайте генератор кода для этого.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Я хочу простой, понятный и безопасный способ. КД>>Желательно, чтобы компилятор сразу выругался на пропущенное поле в списке инициализации. _>Вам не кажется это надуманной проблемой? Или ваш код на 76% состоит из подобных инициализаций? _>Если да, то сделайте генератор кода для этого.
Не кажется. Не состоит, хотя такого кода достаточно много.
Дальнейшее обсуждение наверное уже не имеет смысла — тут уже сказали что проблема будет решена в следующем стандарте плюсов.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --