Jeśli chcesz ograniczyć się do jakiegoś niewielkiego zbioru wartości, to możesz użyć enum class (c++11). Zwykły enum w tym wypadku też nie zrobi ci raczej różnicy od enum class. Tylko ostatecznie to jest tylko iluzja - koniec końców jesteś w stanie przypisać inną wartość jeśli zcastujesz. https://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html
Jeśli możesz sobie pozwolić na zbiór wartości zaczynający się od 0 i kończący na 2^(n)-1, to możesz wykorzystać tzw. 'bit fields'. To jest w cpp od dawna jeśli nie od zawsze. http://en.cppreference.com/w/cpp/language/bit_field
struct A {
unsigned a : 4; // `a` okupuje 4 bity więc przyjmuje wartości 0..15
};
Oczywiście to nie znaczy, że obiekt klasy A zajmuje 4 bity. Jeśli unsigned int ma rozmiar 4 bajtów, to A też będzie miało rozmiar 4 bajtów, tylko 28 bitów pozostanie niewykorzystanych.
Problemem może być też, że nie jesteś w stanie utworzyć pointera/referencji do 'bit fielda'. To możesz jednak obejść tutaj biorąc adres całego obiekt skoro i tak posiada tylko jeden member,