"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 usar enable_if para selecionar funções de membro com base em argumentos de modelo?

Como usar enable_if para selecionar funções de membro com base em argumentos de modelo?

Publicado em 2024-11-11
Navegar:537

How to Use enable_if to Select Member Functions Based on Template Arguments?

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

A metafunção enable_if é utilizada para especificar parâmetros de função de modelo e selecionar funções de membro apropriadas com base neles . Considere o seguinte código:

template
struct Point
{
  // Check if T is int and call MyFunction for int
  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 pode causar erros do compilador indicando que "nenhum tipo chamado 'type' em 'struct std::enable_if'".

Entendendo enable_if

enable_if garante que apenas sobrecargas de funções viáveis ​​sejam consideradas durante a resolução de sobrecarga. Se uma substituição de argumento de modelo falhar, essa sobrecarga será removida do conjunto de candidatos.

No exemplo acima, o argumento de modelo T já é conhecido ao instanciar as funções de membro. Para implementar o comportamento desejado, podemos criar um argumento de modelo fictício padronizado como T e executar SFINAE usando-o:

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