Comment vérifier le type d'un paramètre de modèle?
Supposons que j'ai une fonction de modèle et de deux classes de
class animal {
}
class person {
}
template<class T>
void foo() {
if (T is animal) {
kill();
}
}
Comment puis-je faire le check pour T est un animal? Je ne veux pas avoir
quelque chose qui vérifie pendant le temps d'exécution. Grâce
- Je mettrais "animal de compagnie" au lieu de "tuer" 🙂
Vous devez vous connecter pour publier un commentaire.
Utilisation
is_same
:Généralement, c'est totalement impraticable conception, cependant, et vous voulez vraiment se spécialisent:
Noter également qu'il est inhabituel d'avoir les modèles de fonction explicite (non déduit) arguments. Il n'est pas rare, mais il y a souvent des approches mieux.
C++11
par défaut paramètres du modèle de travail ainsi?T
n'est pas déduit, il n'y a pas beaucoup que vous pouvez faire. Vous pouvez laisser le principal modèle de lettre morte et à créer une spécialisation, ou vous pouvez ajouter un statique affirmation avecis_same
.foo
a pas de paramètres, de sorte qu'aucun des arguments peuvent être passés. Vous devez spécifier l'argument de modèle directement. Et puis le code de la réponse de test pourint
etfloat
, trop (is_same<T, int>
etc.).Je pense qu'aujourd'hui, il est préférable d'utiliser, mais seulement avec le C++17.
Si vous utilisez un type spécifique d'opérations si l'expression du corps sans
constexpr
, ce code ne compilera pas.std::is_same<T, U>::value
vous pouvez utiliser plus courte:std::is_same_v<T, U>
En C++17, nous pouvons utiliser variantes.
À utiliser
std::variant
, vous devez inclure l'en-tête:Après cela, vous pouvez ajouter
std::variant
dans votre code comme ceci:type
qui est la valeur de typeType
ou d'un modèle qui n'a pas de sens ici)is_same_v
n'est pas pertinent dans le contexte devariant
. Le correspondant de "trait" estholds_alternative
.Vous pouvez vous spécialiser vos modèles basés sur ce qui est passé dans leur paramètres comme ceci:
Notez que cela crée une toute nouvelle fonction, basé sur le type qui est passé comme
T
. C'est généralement préférable, car elle réduit l'encombrement et est essentiellement la raison pour laquelle nous avons des modèles à la première place.