2011-12-29 5 views
5

Duplicar posible:
C++ templates that accept only certain types¿Podemos definir una función de plantilla solo para algunos tipos de datos?

Por ejemplo, si queremos definir una función de plantilla que podemos utilizar números enteros, flota, pero no dobles cuerdas. ¿Hay alguna manera fácil de hacerlo?

+0

Por lo que sé, no en C++, incluso en C++ 11, pero las antiguas funciones eliminadas relativas a los conceptos hacen lo que usted desea si lo recuerdo bien. – Geoffroy

+0

@Geoffroy: no hay soporte de nivel de idioma básico para esto, pero usando enable_if se puede hacer (ver mi respuesta). Puede ser un poco engorroso, pero puedo imaginar algunos tipos de ayuda que podrían dar esta sintaxis más agradable en C++ 2011 utilizando plantillas variadic (sin embargo, no he experimentado con esto). –

+0

¿Desea que la misma definición se aplique a los tipos admitidos o necesita definirla de manera diferente para cada uno? es decir, 'f ' tiene exactamente el mismo cuerpo que 'f '? –

Respuesta

8

La forma de hacerlo es usar std::enable_if en alguna forma o forma. El selector para el tipo admitido se usa luego como tipo de devolución. Por ejemplo:

template <typename T> struct is_supported { enum { value = false }; }; 
    template <> struct is_supported<int> { enum { value = true }; }; 
    template <> struct is_supported<float> { enum { value = true }; }; 
    template <> struct is_supported<double> { enum { value = true }; }; 

    template <typename T> 
    typename std::enable_if<is_supported<T>::value, T>::type 
    restricted_template(T const& value) { 
    return value; 
    } 

Obviamente, usted desea dar a los rasgos de un mejor nombre que is_supported. std::enable_if es parte de C++ 2011 pero se implementa fácilmente u obtiene de boost en caso de que no esté disponible con la biblioteca estándar que está utilizando.

En general, a menudo no es necesario imponer restricciones explícitas ya que la implementación de la plantilla generalmente tiene restricciones implícitas. Sin embargo, a veces es útil desactivar o habilitar ciertos tipos.

0

Por lo general, la inclusión en la lista blanca de ciertos tipos restringe mucho el uso de plantillas.

Boost ha llamado concepts que son básicamente interfaces para plantillas. en lugar de incluir en la lista blanca ciertos tipos, puede crear errores de tiempo de compilación si ciertas condiciones (funciones que faltan, o con argumentos incorrectos, etc.) no se cumplen. por supuesto, también puede usar esto para restringir los argumentos de su plantilla a ciertos tipos.

Cuestiones relacionadas