Используйте static_assert, чтобы убедиться, что параметр шаблона используется только * максимум * один раз - PullRequest
1 голос
/ 21 мая 2019

Можно ли гарантировать, что определенный параметр шаблона (или комбинация параметров шаблона) используется - максимум - один раз?Можно ли отследить, сколько раз он использовался, и выдать ошибку static_assert, если он использовался более одного раза?

В качестве примера - скажем, я хотел создать статический класс GPIO на основе шаблонов:

template<uint8_t Port, uint8_t Pin> class Gpio {};

Можно реально расположить всю плату в одном классе плат:

struct Board {
  Gpio<1, 1> myInputPin;
  Gpio<1, 2> myOutputPin;

  Gpio<2, 0> ledR;
  Gpio<2, 1> ledG;
  Gpio<2, 2> ledB;
};

Для любой комбинации портов / выводов это имеет смысл только для один шаблон GPIO, который будет создан для этого порта и вывода.Если кто-то создает два разных экземпляра GPIO для одной и той же комбинации портов и выводов, это, вероятно, представляет конфликт, и я хотел бы уловить эту ошибку во время компиляции.

Возможно ли это?

1 Ответ

2 голосов
/ 21 мая 2019

Вы можете решить эту проблему с помощью макроса:

#define GPIO(Port, Pin) \
    friend void _gpio_ ## Port ## _ ## Pin(){} \
    Gpio<Port, Pin>

Тогда, если вы дважды используете GPIO(2, 2), компилятор скажет что-то вроде этого:

error: redefinition of '_gpio_2_2'
  GPIO(2, 2) ledX;
  ^

<source>:14:3: note: previous definition is here
  GPIO(2, 2) ledB;
  ^

Демо: https://godbolt.org/z/ronV0u

...