2011-07-02 12 views
5

tengo una claseespecialización de plantilla para este tipo proporcionan una clase de rasgos

template <typename T> struct Dispatch; 

que se utiliza para llamar a una función de tipo específico. Por ejemplo, supongamos que tiene como despachadores

template <> struct Dispatch <MyClass> { 
    static void Apply (void* a, MyClass& m) 
    { 
     ::memcpy (a, &m, sizeof (m)); 
    } 
}; 

Ahora tengo un montón de clases para las que tengo un tipo de rasgo, ArrayTypes. Me gustaría hacer algo como:

template <> struct Dispatch <enable_if<IsArrayType>> 
{ 
    template <typename ArrayType> 
    static void Apply (void* a, ArrayType& m) 
    { 
    ::memcpy (a, &m, ArrayTypeTraits<ArrayType>::GetSize (m)); 
    } 
}; 

¿Esto es posible?

Respuesta

4

acaba de encontrar:

template <typename T, class Enable = void> struct Dispatch; 
template <typename T> 
struct Dispatch<T, typename boost::enable_if< typename IsArrayType<T>::type>::type> 
{ 
}; 

Gracias a Kornel.

0

La idea detrás de los rasgos es que se puede proporcionar una implementación por defecto, y los tipos que puede especializarse opcionalmente. De esta manera, usted no tiene casos especiales en el código que utiliza los rasgos. Su enfoque (que tienen casos especiales para clases con y sin rasgos definidos) en contra del propósito de Tipo-rasgos.

Cuestiones relacionadas