Отвечая на заключительный вопрос, "как мне преобразовать a в тип Test::A", вместо того, чтобы быть жестким по поводу необходимости иметь там актерский состав, и ответить на несколько лет позже, просто это кажется популярным вопросом, который, похоже, еще никто не задавал упомянул альтернативу, согласно стандарту С++ 11:
5.2.9 Статическое приведение
... выражение e может быть явно преобразовано в тип T используя static_cast формы static_cast<T>(e), если декларация T t(e); правильно сформирован для некоторой изобретенной временной переменной t (8.5). Эффект такого явного преобразования такой же, как выполнение объявление и инициализация, а затем с использованием временного переменная в результате преобразования.
Поэтому прямое использование формы t(e) также будет работать, и вы можете предпочесть ее для аккуратности:
auto result = Test(a);
Ответ 5
Test castEnum = static_cast<Test>(a-1); приведёт к A. Если вы не хотите подструктуру 1, вы можете переопределить enum:
enum Test
{
A:1, B
};
В этом случае 'Test castEnum = static_cast (a);' может быть использован для приведения к А.