Enums de tipo seguro simulado com C ++

Oi pessoal!

Quero enums que forneçam mensagens de erro úteis e permitam que um nome faça parte de muitos tipos.

enum STATE { ON };
enum MOTOR { ON }:

O texto acima iria reclamar de colisões de nomes.

Dado este método:

void onlyOnOff(ON_OFF on){
if (on == ON){
//do something
}else {
//do something else
}
}

Desejo um erro do compilador em caso de falha em fornecer ON ou OFF para onlyOnOff.

Vamos investigar minha solução:
com a implementação de classes e constantes abaixo, isso funciona.

Se eu passar algo diferente de ON ou OFF para onlyOnOff, recebo uma mensagem de erro como esta:
‘onlyOnOff’: não é possível converter o parâmetro 1 de ‘<tipo>’ para ‘ON_OFF’

class ON_OFF_ {}; typedef const ON_OFF_* const ON_OFF;

class ON_ : public ON_OFF_{};
const ON_ on_; const ON_ * const ON = &on_;

class OFF_ : public ON_OFF_{};
const OFF_ off_; const OFF_ * const OFF = &off_;