@@ -59,33 +59,43 @@ struct poison_config_size_comp_validator : public detail::default_validator
5959 * \tparam validator_t The validator to use. Defaults to sharg::detail::poison_config_size_comp_validator.
6060 * \details
6161 * * Sizes of sharg::config and sharg::detail::poison_config are the same.
62+ * * sharg::config and sharg::detail::poison_config have the same member types (except validator).
6263 * * sharg::detail::poison_config can be constructed with designated initializers from sharg::config's members.
6364 * * sharg::config can be constructed with designated initializers from sharg::detail::poison_config's members.
65+ * The latter two ensure that the order of the members is the same.
6466 */
6567template <typename validator_t = poison_config_size_comp_validator>
66- concept poison_config_valid = (sizeof (poison_config) == sizeof (config<validator_t >))
67- && requires (config<validator_t > cfg, poison_config poison_cfg) {
68- {
69- poison_config{.short_id = cfg.short_id ,
70- .long_id = cfg.long_id ,
71- .description = cfg.description ,
72- .default_message = cfg.default_message ,
73- .advanced = cfg.advanced ,
74- .hidden = cfg.hidden ,
75- .required = cfg.required ,
76- .validator = cfg.validator }
77- };
78- {
79- config<validator_t >{.short_id = poison_cfg.short_id ,
80- .long_id = poison_cfg.long_id ,
81- .description = poison_cfg.description ,
82- .default_message = poison_cfg.default_message ,
83- .advanced = poison_cfg.advanced ,
84- .hidden = poison_cfg.hidden ,
85- .required = poison_cfg.required ,
86- .validator = std::any_cast<validator_t >(poison_cfg.validator )}
87- };
88- };
68+ concept poison_config_valid =
69+ (sizeof (poison_config) == sizeof (config<validator_t >))
70+ && std::same_as<decltype (poison_config{}.short_id), decltype (config<validator_t >{}.short_id)>
71+ && std::same_as<decltype (poison_config{}.long_id), decltype (config<validator_t >{}.long_id)>
72+ && std::same_as<decltype (poison_config{}.description), decltype (config<validator_t >{}.description)>
73+ && std::same_as<decltype (poison_config{}.default_message), decltype (config<validator_t >{}.default_message)>
74+ && std::same_as<decltype (poison_config{}.advanced), decltype (config<validator_t >{}.advanced)>
75+ && std::same_as<decltype (poison_config{}.hidden), decltype (config<validator_t >{}.hidden)>
76+ && std::same_as<decltype (poison_config{}.required), decltype (config<validator_t >{}.required)>
77+ && requires (config<validator_t > cfg, poison_config poison_cfg) {
78+ {
79+ poison_config{.short_id = cfg.short_id ,
80+ .long_id = cfg.long_id ,
81+ .description = cfg.description ,
82+ .default_message = cfg.default_message ,
83+ .advanced = cfg.advanced ,
84+ .hidden = cfg.hidden ,
85+ .required = cfg.required ,
86+ .validator = cfg.validator }
87+ };
88+ {
89+ config<validator_t >{.short_id = poison_cfg.short_id ,
90+ .long_id = poison_cfg.long_id ,
91+ .description = poison_cfg.description ,
92+ .default_message = poison_cfg.default_message ,
93+ .advanced = poison_cfg.advanced ,
94+ .hidden = poison_cfg.hidden ,
95+ .required = poison_cfg.required ,
96+ .validator = std::any_cast<validator_t >(poison_cfg.validator )}
97+ };
98+ };
8999
90100static_assert (poison_config_valid<>, " sharg::detail::poison_config must have the same members as sharg::config!" );
91101
0 commit comments