Comprobación de tipos estáticos de metaprogramación de plantillas C ++

No pude encontrar una respuesta a mi problema, así que la publico como una pregunta. Hago un pequeño maniquí de ejemplo para explicarlo:

enum STORAGE_TYPE
{
    CONTIGUOUS,
    NON_CONTIGUOUS
};

template <typename T, STORAGE_TYPE type=CONTIGUOUS>
class Data
{
    public:
        void a() { return 1; }
};

// partial type specialization
template <typename T>
class Data<T, NON_CONTIGUOUS>
{
    public:
        void b() { return 0; }
};

// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
    /* How could I determine statically the STORAGE_TYPE? */
    #if .. ?? 
        d.a();
    #else
        d.b();
    #endif      
}


int main()
{
    Data<int> d1;
    Data<int, NON_CONTIGUOUS> d2;

    func(d1);
    func(d2);

    return 0;
}

Tenga en cuenta que (1) No quiero una especialización de "func", ya que eso podría resolverlo, pero solo quiero tener un método genérico de "func" con condiciones internas estáticas "if" para ejecutar el código.(2) y preferiría la solución con C ++ estándar (no C ++ 0x o boost).

Respuestas a la pregunta(2)

Su respuesta a la pregunta