Pregunta

¿Es posible utilizar un parámetro de plantilla constante no-tipo en una directiva de preprocesador? Aquí es lo que tengo en mente:

template <int DING>
struct Foo
{
    enum { DOO = DING };
};

template <typename T>
struct Blah
{
    void DoIt()
    {
        #if (T::DOO & 0x010)

        // some code here

        #endif
    }
};

Cuando intento esto con algo como Blah<Foo<0xFFFF>>, VC ++ 2010 se queja de algo acerca de paréntesis, sin igual en la línea en la que están tratando de utilizar #if. Estoy adivinando el preprocesador en realidad no se sabe nada acerca de las plantillas y este tipo de cosas simplemente no está en su dominio. ¿Que dice?

¿Fue útil?

Solución

No, esto no es posible. El preprocesador es bastante tonto, y no tiene conocimiento de la estructura de su programa. Si T::Doo no está definido en el preprocesador (y que no puede ser, debido a la ::), no se puede evaluar esa expresión y se producirá un error.

Sin embargo, usted puede confiar en que el compilador de hacer lo más inteligente para usted:

        if (T::Doo & 0x010) {
            // some code here
        }

Las expresiones constantes y ramas muertas están optimizados de distancia, incluso a los ajustes de optimización más bajos, por lo que puede hacer con seguridad esto sin ningún tipo de gastos en tiempo de ejecución.

Otros consejos

lo que los miembros están disponibles en T depende de qué bits se establecen en T::DOO

Me suena como T::DOO está actuando como un identificador subclase. Así que estoy pensando que su Foo y clases relacionadas deben ser subclases de una clase que garantiza que se define DOO.

La clave es: ¿por qué debe usted utilizar un campo de bits

No estoy seguro si esto se aplica a su situación, pero es posible aislar los diferentes casos con clases de plantilla. Por ejemplo: (usando una versión modificada de su código de arriba)

template <typename T, int N>
struct Blah
{
    void DoIt()
    {
        // normal DoIt() code
    }
};

template <typename T>
struct Blah<T,5>
{
    void DoIt()
    {
        // special DoIt() code for only when N==5
    }
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top