C ++ ресурс времени ссылки "распределение" без определений - PullRequest
0 голосов
/ 03 февраля 2020

В настоящее время я работаю над классом C ++ для ESP32. Я хочу реализовать распределение ресурсов, таких как: IO-Pins, доступные каналы RMT и так далее. Моя идея состоит в том, чтобы сделать это с помощью какого-то обработчика ресурсов, который проверяет это во время компиляции, но у меня нет хорошей идеи, и я пока не нашел ничего подобного.

Чтобы прояснить мою проблему, давайте приведем пример о чем я Микроконтроллер X имеет выводы ввода-вывода 1-5, каждый из которых может использоваться ровно одним компонентом.

Компоненты ничего не знают друг от друга и принимают вывод, который они должны использовать в качестве аргумента ctor. Теперь я хочу иметь класс / метод / ..., который проверяет, выделен ли контакт, необходимый компоненту, во время компиляции.

CompA a(5); //works well: 5 is not in use
CompB b(3); //same as before, without the next line it should compile
CompC c(5); //Pin 5 is already in use: does not compile!

Я пока не уверен, как это сделать. Мое лучшее предположение (поскольку я не могу использовать определения здесь: пользователи должны иметь возможность использовать его только путем предоставления параметра или аргумента шаблона), что оно может работать с функцией шаблона, но я не нашел способа проверить, какой другие параметры были переданы шаблонному методу / классу.

Edit1 : Части программы могут быть либо автоматически сгенерированы, либо определены пользователем таким образом, что они не знают о других применениях выводов , Распределение, таким образом, является функцией «безопасности», которая должна запрещать ошибочный код. Это также должно запрещать это, если функции регистров находятся в разных путях кода (даже если они могут исключать друг друга)

Edit2 : я получил ответ, что время компиляции здесь не так, как компоненты могут быть скомпилированы отдельно от другого. Так что единственный способ сделать это - ошибка компоновщика.

1 Ответ

0 голосов
/ 03 февраля 2020

Глупый метод в стиле C: вы можете отчаянно использовать __COUNTER__ в качестве аргумента конструктора. Этот динамический макрос c увеличивается каждый раз после каждого появления, начиная с 0.

Надеюсь, есть лучшее решение.

...