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)&nbsp;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)&nbsp;y preferiría la solución con C ++ estándar (no C ++ 0x o boost).