Articles of sfinae

Especialização em modelos e problemas enable_if

Eu estou correndo em um problema sobre o uso adequado de habilitar_if e especialização de modelo. Depois de modificar o exemplo (por razões de confidencialidade), aqui está um exemplo comparável: Eu tenho a function chamada “less” que verifica se o primeiro argumento é menor que o segundo argumento. Digamos que eu queira ter dois tipos […]

O que é o decltype com dois argumentos?

Edit, para evitar confusão: decltype não aceita dois argumentos. Veja as respostas. As duas estruturas a seguir podem ser usadas para verificar a existência de uma function de membro em um tipo T durante o tempo de compilation: // Non-templated helper struct: struct _test_has_foo { template static auto test(T* p) -> decltype(p->foo(), std::true_type()); template static […]

Detectando constexpr com SFINAE

Estou trabalhando na atualização de alguns códigos C ++ para aproveitar a nova funcionalidade do C ++ 11. Eu tenho uma class de traço com algumas funções retornando tipos fundamentais que na maioria das vezes, mas nem sempre, retornam uma expressão constante. Eu gostaria de fazer coisas diferentes com base em se a function é […]

Por que devo evitar std :: enable_if em assinaturas de function

Scott Meyers postou conteúdo e status de seu próximo livro EC ++ 11. Ele escreveu que um item no livro poderia ser “Evitar std::enable_if em assinaturas de function” . std::enable_if pode ser usado como um argumento de function, como um tipo de retorno ou como um modelo de class ou parâmetro de modelo de function […]

Exemplos de C ++ SFINAE?

Eu quero entrar em mais meta-programação de template. Eu sei que SFINAE significa “falha de substituição não é um erro”. Mas alguém pode me mostrar um bom uso para a SFINAE?

Como verificar se o operador == existe?

Eu estou tentando criar um exemplo, que iria verificar a existência do operator== (membro ou function não-membro). Para verificar se uma class tem um operator== membro operator== é fácil, mas como verificar se ele tem um operator== não-membro operator== ? Isto é o que tenho até agora: #include struct A { int a; #if 0 […]

O que exatamente é o “contexto imediato” mencionado no Padrão C ++ 11 para o qual a SFINAE se aplica?

O parágrafo 14.8.2 / 8 da norma C ++ 11 especifica as condições sob as quais uma falha de substituição deve ou não resultar em um erro de compilation “difícil” (fazendo com que a compilation falhe) ou em um erro “soft” que apenas faça com que o compilador descarte um modelo de um conjunto de […]

Metaprogramação: falha na definição da function define uma function separada

Nesta resposta eu defino um modelo baseado na propriedade is_arithmetic do tipo: template enable_if_t<is_arithmetic::value, string> stringify(T t){ return to_string(t); } template enable_if_t<!is_arithmetic::value, string> stringify(T t){ return static_cast(ostringstream() << t).str(); } O dyp sugere que, em vez da propriedade is_arithmetic do tipo, que to_string seja definido para o tipo seja o critério de seleção do modelo. […]

SFINAE para verificar funções membro herdadas

Usando o SFINAE, posso detectar se uma determinada class possui uma determinada function de membro. Mas e se eu quiser testar as funções de membro herdadas? O seguinte não funciona em VC8 e GCC4 (isto é, detecta que A tem uma function de membro foo() , mas não que B herda uma): #include template struct […]

Por que expressões constantes têm uma exclusão por comportamento indefinido?

Eu estava pesquisando o que é permitido em uma expressão constante * , que é abordada na seção 5.19 Expressões constantes, parágrafo 2 do padrão C ++, que diz: Uma expressão condicional é uma expressão constante central a menos que envolva um dos seguintes itens como uma subexpressão potencialmente avaliada (3.2), mas subexpressões de operações […]