On Fri, 3 Jun 2022 at 09:19, Julien Blanc
Le 2022-06-03 08:44, Richard Hodges via Boost a écrit :
On Fri, 3 Jun 2022 at 08:31, Julien Blanc via Boost
wrote: Are you able to provide one or two motivating use cases? i.e. scenarios in which I would strongly prefer to use this library rather than a std::array and static_cast?
You mean, in addition to https://github.com/julien-Blanc-tgcm/indexed_array#sample-use-cases ?
Yes, I'm looking for a real-world use case. The trivial hypothetical cases offered are building a static association between an enum value and some other value. This can be done with switch/case (for example), in about the same amount of typing, at compile time, in a function. For example: constexpr std::uint32_t base_address(i2c_id id) { switch(id) { case i2c_id::i2c1: return 0x1060000u; case i2c_id::i2c2: return 0x1070000u; case i2c_id::i2c3: return 0x1080000u; case i2c_id::i2c4: return 0x1090000u; } } constexpr std::uint32_t offset(i2c_register r) { switch(r) { case i2c_register::set_clock: return 0; case i2c_register::read: return 1; case i2c_register::write: return 2; case i2c_register::ack: return 3; } } https://godbolt.org/z/bYYq65hc6 Another benefit that i did not speak of is that you get type safety for
the index. i.e. you cannot use a wrongly typed index:
indexed_array
messages; std::array messages_arr; // ... play_message(messages_arr[static_cast<int>(tech_message::goon)]); // boom at runtime play_message(messages[tech_message::goon]); // fails to compile I also find the code clearer (the static_cast just adds noise in my opinion), but that would be a matter of taste.
Regards,
Julien