"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como selecionar uma função de membro com base em um parâmetro de modelo usando `enable_if`?

Como selecionar uma função de membro com base em um parâmetro de modelo usando `enable_if`?

Publicado em 2024-11-06
Navegar:114

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

Selecionando uma função de membro usando condições Enable_If

A tarefa é determinar a invocação de uma função de membro com base em um parâmetro de modelo de classe. O seguinte trecho de código tenta fazer isso:

#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 

No entanto, este código falha ao compilar com o erro "nenhum tipo chamado 'type' em 'struct std::enable_if'".

SFINAE em ação

A chave para entender esta questão está no conceito de Falha de Substituição Não é um Erro (SFINAE). Enable_if permite compilação condicional baseada em argumentos de modelo. Neste caso, o argumento do modelo T já é conhecido quando as funções-membro são instanciadas. Portanto, a condição é avaliada no momento da instanciação e a função correspondente é selecionada.

Consertando o código

Para corrigir isso, precisamos introduzir um argumento de modelo fictício que o padrão é T. Isso permite que o mecanismo SFINAE funcione conforme planejado. O código modificado ficaria assim:

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 

Prevenindo a especialização explícita de funções de membro

Como apontado por HostileFork, o código original permite a especificação explícita de argumentos de modelo para as funções de membro, o que pode levar a resultados incorretos. Para evitar isso, podemos adicionar um static_assert que verifica se algum argumento do modelo é fornecido. Isso garante que a função de membro correta seja sempre invocada com base no argumento do modelo T. O código modificado seria:

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 
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3