Более простой способ ограничения порядка аргументов шаблона - PullRequest
0 голосов
/ 09 июля 2019

Я хочу подключить чип (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>{});

, он не скомпилируется.

Но мне было интересно, есть ли более простой способ добиться того же.Ты знаешь лучший способ?

1 Ответ

0 голосов
/ 09 июля 2019

У вас может быть что-то вроде:

template <typename, typename, typename> struct IC;

template<int a, int b, int c>
struct IC<Pin_A<a>, Pin_B<b>, Pin_C<c>>
{
    // ...
};
...