У меня есть шаблонный класс, скажем:
template <int X>
struct Foo {
static int get() {return X;}
};
Я, конечно, могу явно создать экземпляр нужной версии:
template class Foo<1>;
Я хочу выдать ошибку во время компиляции, еслипопытка второго явного создания экземпляра.
template class Foo<1>;
template class Foo<2>; // How to error here at compile time?
Возможно ли это?
Я подозреваю, что для того, чтобы компоновщик перехватил, нужно будет использовать какой-то трюк "переопределения"это если компиляция выполняется в нескольких единицах перевода.Я не могу на всю жизнь выяснить, возможно ли это или как это сделать.
Если есть способ сделать это, работает ли он без явной реализации шаблона?
Context
Я пишу полностью статическую библиотеку классов для управления некоторым оборудованием на используемом мной микроконтроллере.Я хочу упростить изменение параметра времени компиляции (X
) и поэтому использую шаблоны.#define
не допускается.constexpr
не будет работать, как бы вы #include
зависимый исходный файл?
В частности, у меня есть функция init()
, которую можно запустить только один раз, и я на самом деле использую __attribute__((constructor))
заставить его работать для меня до main()
.Если какой-то другой пользователь библиотеки непреднамеренно создаст экземпляр второго экземпляра, произойдут плохие вещи.