En C, SFINAE (la falla de sustitución no es un error) le permite habilitar o deshabilitar el código según el tipo de argumento de plantilla. Sin embargo, cuando se trata de funciones miembro de una plantilla de clase, SFINAE a menudo no funciona como se esperaba.
Aquí hay un ejemplo que demuestra el problema:
#include
struct A {};
struct B {};
template
struct Foo
{
typename std::enable_if<:is_same a>::value>::type bar()
{}
typename std::enable_if<:is_same b>::value>::type bar()
{}
};
En este ejemplo, Foo define dos funciones miembro sobrecargadas bar(). La primera sobrecarga se habilita cuando T es A y la segunda se habilita cuando T es B. Sin embargo, si intenta compilar este código, recibirá un mensaje de error que indica que las sobrecargas no se pueden resolver.
El motivo de este error es que SFINAE solo funciona para argumentos de plantilla deducidos. En el caso de funciones miembro de una plantilla de clase, el argumento de la plantilla no se deduce sino que se especifica explícitamente. Para solucionar el problema, puede utilizar una de las siguientes técnicas:
Usar argumentos de plantilla explícitos:
struct Foo
{
void bar(A) {}
void bar(B) {}
};
Utilice std::enable_if dentro de las funciones miembro:
template
struct Foo
{
template
typename std::enable_if<:is_same a>::value>::type bar() {}
template
typename std::enable_if<:is_same b>::value>::type bar() {}
};
Usar especialización de plantilla de clase explícita:
template struct Foo { void bar() {} };
template struct Foo { void bar() {} };
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