Articles of sfinae

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 […]

Como detectar se existe uma variável de membro específica na class?

Para criar a function de modelo de algoritmo, preciso saber se x ou X (e y ou Y) na class que é um argumento de modelo. Pode ser útil ao usar minha function para CPFC class MFC ou GDI + PointF class ou alguns outros. Todos eles usam diferentes x neles. Minha solução pode ser […]

SFINAE trabalhando no tipo de retorno, mas não como parâmetro de modelo

Eu já usei o idioma SFINAE algumas vezes e me acostumei a colocar meus std::enable_if em parâmetros de template ao invés de em tipos de retorno. No entanto, deparei-me com um caso trivial em que não funcionou e não sei porquê. Primeiro de tudo, aqui é meu principal: int main() { foo(5); foo(3.4); } Aqui […]

Como funciona o `void_t`

Eu assisti a palestra de Walter Brown na Cppcon14 sobre programação de modelos modernos ( Parte I , Parte II ) onde ele apresentou sua técnica void_t SFINAE. Exemplo: Dado um modelo de variável simples que avalia como void se todos os argumentos de modelo são bem formados: template using void_t = void; e o […]