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.
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
@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). –
¿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 '? –