Selección de una función miembro utilizando las condiciones Enable_If
La tarea consiste en determinar la invocación de una función miembro en función de un parámetro de plantilla de clase. El siguiente fragmento de código intenta lograr esto:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout Sin embargo, este código no se compila con el error "no hay tipo llamado 'tipo' en 'struct std::enable_if'".
SFINAE en acción
La clave para comprender este problema radica en el concepto de que el fallo de sustitución no es un error (SFINAE). Enable_if permite la compilación condicional basada en argumentos de plantilla. En este caso, el argumento de plantilla T ya se conoce cuando se crean instancias de las funciones miembro. Por lo tanto, la condición se evalúa en el momento de la instanciación y se selecciona la función correspondiente.
Arreglando el código
Para rectificar esto, necesitamos introducir un argumento de plantilla ficticio que El valor predeterminado es T. Esto permite que el mecanismo SFINAE funcione según lo previsto. El código modificado se vería así:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
std::cout Evitar la especialización explícita de funciones miembro
Como lo señaló HostileFork, el código original permite la especificación explícita de argumentos de plantilla para las funciones miembro, lo que podría llevar a resultados incorrectos. Para evitar esto, podemos agregar un static_assert que verifique si se proporciona algún argumento de plantilla. Esto garantiza que siempre se invoque la función miembro correcta según el argumento de la plantilla T. El código modificado sería:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3