Я занимаюсь рефакторингом класса, который в настоящее время имеет метод:
void resize(size_t sz)
В текущей кодовой базе sz всегда равно 0,1,2 или 3.
Базовый класс меняется от динамического выделения к предварительно выделенному массиву maxsize == 3.
Как я могу получить ошибку времени сборки, если кто-то пытается изменить размер до sz> 3?
Достаточно просто добавить проверку во время выполнения. Но я бы предпочел получить проверку во время компиляции, которая не удалась раньше.
Я не хочу изменять какой-либо существующий код, который выполняет вызовы с целочисленным литералом, который находится в границах, например:
x.resize(2)
должен по-прежнему компилироваться как есть.
Но если кто-то придет и попытается
x.resize(4)
or
x.resize(n)
он не должен компилироваться или ссылаться.
Я думал о шаблоне, специализированном для int, который не определен ни для чего, кроме {0,1,2,3}. Но я не совсем уверен, как заставить его делать то, что я хочу, в рамках стандарта c ++.
редактирование:
Я должен остановиться на своих мыслях об использовании шаблона. Я вполне готов изменить объявление функции изменения размера. Я не хочу менять телефонный код.
например. Я думал что-то вроде
void resize( ConstructedFromLiteral<0,3> sz)
или
void resize( ConstructedFromLiteral<0> sz)
void resize( ConstructedFromLiteral<1> sz)
void resize( ConstructedFromLiteral<2> sz)
void resize( ConstructedFromLiteral<3> sz)