Suponha que eu tenha uma função de modelo e duas classes
class animal {
}
class person {
}
template<class T>
void foo() {
if (T is animal) {
kill();
}
}
Como faço para verificar se é animal? Não quero ter algo que verifique durante o tempo de execução. obrigado
Respostas:
Use
is_same
:Normalmente, esse é um design totalmente impraticável, e você realmente quer se especializar :
Observe também que é incomum ter modelos de função com argumentos explícitos (não deduzidos). Não é inédito, mas geralmente existem abordagens melhores.
fonte
T
não se deduz, não há muito que você possa fazer. Você pode deixar o modelo primário sem implementação e criar uma especialização ou pode adicionar uma declaração estática comis_same
.Acho que hoje é melhor usar, mas só com C ++ 17.
Se você usar algumas operações específicas de tipo em if expression body sem
constexpr
, este código não será compilado.fonte
std::is_same<T, U>::value
você poderia usar mais curto:std::is_same_v<T, U>
Em C ++ 17, podemos usar variantes .
Para usar
std::variant
, você precisa incluir o cabeçalho:Depois disso, você pode adicionar
std::variant
seu código da seguinte forma:fonte
type
que é o valor do tipoType
ou um modelo que não faz sentido aqui)is_same_v
não é significativo no contexto devariant
. O "traço" correspondente éholds_alternative
.std::variant
é totalmente desnecessário aquiVocê pode especializar seus modelos com base no que é passado em seus parâmetros, como este:
Observe que isso cria uma função totalmente nova com base no tipo que é passado como
T
. Isso geralmente é preferível, pois reduz a desordem e é essencialmente a razão pela qual temos modelos em primeiro lugar.fonte