"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 implementar sobrecargas de funções de membros condicionais usando enable_if em C++?

Como implementar sobrecargas de funções de membros condicionais usando enable_if em C++?

Publicado em 2024-11-08
Navegar:459

How to Implement Conditional Member Function Overloads Using enable_if in C  ?

Selecionando uma função de membro com diferentes condições enable_if

Em C , enable_if é uma ferramenta usada para habilitar ou desabilitar condicionalmente determinado código com base em se um argumento de modelo atende a critérios específicos. Isso pode ser útil quando você deseja personalizar o comportamento de uma classe ou função com base em seus parâmetros de modelo.

No exemplo fornecido, o objetivo é criar uma função membro MyFunction que se comporte de maneira diferente dependendo se o modelo o parâmetro T é um número inteiro ou não. A implementação pretendida é usar duas sobrecargas de MyFunction, uma para T = int e outra para T != int.

Uma abordagem para conseguir isso é através de enable_if, conforme mostrado no código abaixo:

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 resultará em erros de compilação devido ao uso incorreto de enable_if. Em C , a substituição dos argumentos do modelo ocorre durante a resolução da sobrecarga. Nesse caso, não há substituição porque o tipo de T é conhecido no momento da instanciação da função membro.

Para corrigir esse problema, um parâmetro de modelo fictício pode ser introduzido e padronizado como T, permitindo SFINAE (Falha de substituição não é um erro) para funcionar corretamente:

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 

Essa abordagem garante que a versão correta de MyFunction seja selecionada com base no valor de T.

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