Not gonna lie, I think use of this `enum` is inappropriate. It contains things that should be directly in template.  I also think that use of `typedef` looked smart at first (less typos with hard-coded strings, some autocompletion with IDE), but the code itself is hard to read, so code maintenance is quite poor.