Rasgo de tipo C ++ 11 para diferenciar entre clase de enumeración y enumeración regular

Estoy escribiendo un alias de plantilla de promoción similar a boost :: promot pero para C ++ 11. El propósito de esto es evitar advertencias cuando se recuperan argumentos de funciones varidic. p.ej.

template <typename T>
std::vector<T> MakeArgVectorV(int aArgCount, va_list aArgList)
{
    std::vector<T> args;
    while (aArgCount > 0)
    {
        args.push_back(static_cast<T>(va_arg(aArgList, Promote<T>)));
        --aArgCount;
    }
    return args;
}

El alias de la plantilla Promover promueve el tipo que sigue a la promoción de argumentos predeterminada para los argumentos variadic: 1) Un entero que es más pequeño que un int se promueve a int 2) Un flotador se promueve a doble

Mi problema es que se puede promover una enumeración estándar de C ++ pero no se promueve una clase de enumeración de C ++ 11 (el compilador no genera una advertencia). Quiero Promover para trabajar con una enumeración regular pero ignorar una clase de enumeración de C ++ 11.

¿Cómo puedo saber la diferencia entre una clase de enumeración y una enumeración en el alias de mi plantilla de promoción?

Respuestas a la pregunta(1)

Su respuesta a la pregunta