Scott Meyers publicou o conteúdo e o status de seu próximo livro EC ++ 11. Ele escreveu que um item do livro poderia ser "Evitar std::enable_if
assinaturas de funções" .
std::enable_if
pode ser usado como argumento de função, como tipo de retorno ou como modelo de classe ou parâmetro de modelo de função para remover condicionalmente funções ou classes da resolução de sobrecarga.
Em esta questão todos os três solução são mostrados.
Como parâmetro de função:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Como parâmetro do modelo:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Como tipo de retorno:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Qual solução deve ser preferida e por que devo evitar outras?
- Em que casos "Evitar
std::enable_if
assinaturas de função" refere-se ao uso como tipo de retorno (que não faz parte da assinatura normal da função, mas de especializações de modelo)? - Existem diferenças para os modelos de função membro e não membro?
std::enable_if
de bagunçar minhas assinaturas de funções (especialmente a nullptr
versão feia de argumentos de funções adicionais ) porque sempre parece com o que é, um truque estranho (para algo que static if
pode faça muito mais bonito e limpo) usando o template black-magic para explorar um recurso de linguagem interessante. É por isso que eu prefiro o envio de tags sempre que possível (bem, você ainda tem argumentos estranhos adicionais, mas não na interface pública e também muito menos feia e enigmática ).
=0
em typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
realizar? Não consegui encontrar os recursos corretos para entendê-lo. Eu sei que a primeira parte anterior =0
tem um tipo de membro int
se U
e int
é o mesmo. Muito Obrigado!