"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué SFINAE no funciona con funciones de miembros de plantillas de clase?

¿Por qué SFINAE no funciona con funciones de miembros de plantillas de clase?

Publicado el 2024-11-10
Navegar:352

Why Doesn't SFINAE Work with Member Functions of Class Templates?

¿Por qué SFINAE (enable_if) no funciona para funciones miembro de una plantilla de clase?

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() {} };
Último tutorial Más>

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