Могу ли я обеспечить создание объекта только один раз во время компиляции? - PullRequest
2 голосов
/ 09 июля 2019

Избегайте проблем во время выполнения, утверждая, что объект создан один раз во время компиляции, и избегайте динамических объектов.

Предположим, что есть ряд ресурсов HW, которые не могут использоваться двумя модулями приложения.Позвольте сказать, Булавки.Существуют разные аппаратные конфигурации и выполняются разные сборки - было бы здорово убедиться, что один ресурс HW (например, пин в простейшем случае) используется только один раз, и не проверять это во время выполнения.

template <uint8_t pin> 
struct Pin {
    static constexpr uint8_t Number = pin;
    /*.... */
}

Тогдая могу создать

Pin<1> pin1;
Pin<2> pin2;

Интересно, смогу ли я получить ошибку компиляции / утвердить, когда я объявлю тот же пин еще раз:

Pin<2> pin2duplicate;

1 Ответ

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

Да, можно гарантировать, что только один экземпляр обрабатывает представление данных вывода, также с несколькими единицами перевода для одного приложения.

Идея: сделать все элементы данных вашего класса шаблона статическими,Таким образом, все члены являются одинаковыми во всех случаях.Это должно привести к ожидаемому поведению.Поскольку каждый тип (и каждый экземпляр шаблона является типом) имеет свои собственные данные, вы можете иметь несколько выводов, каждый из которых имеет свой собственный набор данных.

Пример:

template <uint8_t pin>
struct Pin
{
    static constexpr uint8_t Number = pin;

    static bool state;

    void SetState( bool newState ) { state = newState; }
    bool CheckState() const { return state; }
};

template< uint8_t pin >
bool Pin<pin>::state = false;

int main()
{   
    Pin<1> p1; 
    Pin<1> p1duplicate;
    Pin<2> p2;

    std::cout << p1.CheckState() << std::endl;
    std::cout << p1duplicate.CheckState() << std::endl;
    std::cout << p2.CheckState() << std::endl;
    p1.SetState(true);
    std::cout << p1.CheckState() << std::endl;
    std::cout << p1duplicate.CheckState() << std::endl; // here we have the data also changed in the duplicate
    std::cout << p2.CheckState() << std::endl;   // as you can see, p2 is not changed as required.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...