"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 > ¿Cómo seleccionar una función miembro basada en un parámetro de plantilla usando `enable_if`?

¿Cómo seleccionar una función miembro basada en un parámetro de plantilla usando `enable_if`?

Publicado el 2024-11-06
Navegar:625

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

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 
Ú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