Для индекса массива я бы использовал size_t при условии, что мне не нужны отрицательные значения, потому что для этого он и нужен. Конечно, это часто - unsigned int, поэтому вообще не даст вам никакой безопасности типов. Однако все, что обеспечило вам безопасность типов (т. Е. Остановило назначение целого числа без знака для индекса массива), также остановит возврат значения size_t в ваш тип. В любом случае, это может быть слишком много безопасности типов.
Возможно, вы можете использовать enum для ограниченных диапазонов:
enum YearDay {
FirstJan = 0,
LastDecInLeapYear = 365
};
Вы можете назначить YearDay для int, но вы не можете назначить int (или другой тип перечисления) для YearDay без явного приведения. Любое значение между наименьшим и наибольшим именованным значением в перечислении является допустимым значением для перечисления. Присвоение значения за пределы диапазона [0,365] приводит к неопределенному поведению. Или, возможно, неуказанный или определенный реализацией результат, я не могу вспомнить.
Возраст сложен, потому что он почти ограничен, но не совсем. Вы можете использовать 969 (возраст Метузела) в перечислении или класс, заключающий int в явные преобразования, как описано другими.