Estoy tratando de definir una función usando plantillas y quiero que el nombre de tipo sea int o anEnum (una enumeración específica que había definido). He intentado lo siguiente pero he fallado:
template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T>
bool isFunction(const T &aVariable){}
Lo que intento hacer es usar plantillas, en lugar de definir dos funciones sobrecargadas. Preferiría que se llamara a la función de la siguiente manera, sin que el programador tenga que considerar el tipo
isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable)
Básicamente, quiero que esta función tenga una plantilla para los tipos int y aNum. He buscado esto, pero no pude encontrar la respuesta. ¿Qué me puedo perder? Gracias,
false
para otros tipos o no desea crear instancias de la función para otros tipos?Respuestas:
Además de la respuesta que no es C ++ 20, si por casualidad puede usar C ++ 20 y su
concepts
función, le sugeriría la siguiente implementación:Manifestación
ACTUALIZAR
Según el comentario de @RichardSmith , aquí hay un enfoque más escalable y reutilizable:
fuente
template<typename T, typename ...U> concept one_of = (std::is_same_v<T, U> || ...);
template<one_of<int, MyEnum> T> bool isFunction(T const& aVariable) {
Hay un par de formas de lograr esto. Todos implican usar el
type_traits
encabezado. Puede hacer una aserción estática sobre los tipos en cuestión en el cuerpo de la función, por ejemplo.O, si necesita considerar esta función entre otras sobrecargas, se puede emplear una técnica SFINAE.
Esto eliminará la función de un conjunto de sobrecarga antes de que se llame si los tipos no coinciden. Pero si no necesita este comportamiento, una aserción estática permite un mensaje de error más amigable para el programador.
fuente
¿Qué hay de esta solución? Se compilará un código con la función si el tipo T cumple con sus requisitos. De lo contrario, la aserción estática falló.
fuente
isFunction(std::string_view)
). La firma seguirá siendo una coincidencia válida, pero la creación de instancias causa un error.He mejorado la respuesta https://stackoverflow.com/a/60271100/12894563 . 'Si constexpr' puede ayudar en esta situación:
isFunction (1L) fallará porque no hay una función sobrecargada o una rama 'if constexpr'.
ACTUALIZACIÓN: reparado perdido
https://godbolt.org/z/eh4pVn
fuente
static_assert(false, ...)
es NDR mal formado, sin siquiera ser utilizado. Si tiene suerte, su compilador le dirá de inmediato, como lo hace Clang, godbolt.org/z/m_Gk9n