Я хочу подключить чип (IC) к микроконтроллеру.Для этого мне нужно подключить конкретные контакты микроконтроллера к IC.Как я знаю, соединение во время компиляции, лучший способ сделать это с помощью шаблона:
template<int num_pin_a, int num_pin_b, int num_pin_c>
struct IC{
// ...
};
В этом примере мой IC имеет 3 контакта: A, B и C.
Проблема с этим кодом в том, что он немного подвержен ошибкам.Чтобы создать IC, мне нужно написать
IC<14, 10, 7> my_ic;
Но что означает 14, 10 и 7?Я не могу прочитать этот код, и я хочу прочитать свой код.Конечно, я могу использовать макросы или constexpr, чтобы избежать магических чисел, и поэтому я могу читать код, но компилятор не может.Я хочу, чтобы мой компилятор сообщал мне, если a допустил ошибку.
Чтобы добиться этого, я написал следующий код:
template<int n>
struct Pin_A{};
template<int n>
struct Pin_B{};
template<int n>
struct Pin_C{};
template<int num_pin_a, int num_pin_b, int num_pin_c>
IC<num_pin_a, num_pin_b, num_pin_c> ic(Pin_A<num_pin_a>,
Pin_B<num_pin_b>,
Pin_C<num_pin_c>)
{
return IC<num_pin_a, num_pin_b, num_pin_c>{};
}
Когда я хочу создать IC, мне нужнонапишите этот код:
auto my_ic = ic(Pin_A<14>{}, Pin_B<10>{}, Pin_C<7>{});
, и это удивительно, потому что я могу понять, и компилятор также понимает это.Например, если я изменю порядок выводов
auto my_ic = ic(Pin_A<14>{}, Pin_C<10>{}, Pin_B<7>{});
, он не скомпилируется.
Но мне было интересно, есть ли более простой способ добиться того же.Ты знаешь лучший способ?