La différence entre l'instanciation et la spécialisation dans les modèles c++
Quelle est la différence entre la spécialisation et de l'instanciation dans le contexte de modèles C++. De ce que j'ai lu jusqu'à présent la suivante est ce que j'ai compris à propos de la spécialisation et de l'instanciation.
template <typename T>
struct Struct
{
T x;
};
template<>
struct Struct <int> //specialization
{
//code
};
int main()
{
Struct <int> s; //specialized version comes into play
Struct <float> r; //Struct <float> is instantiated by the compiler as shown below
}
Instanciation de Struct <float>
par le compilateur
template <typename T=float>
struct Struct
{
float x;
}
Est ma compréhension de l'instanciation d'un modèle et de la spécialisation correct?
Vous devez vous connecter pour publier un commentaire.
4 concepts:
(implicite) de l'instanciation de: c'est ce que vous appelez l'instanciation
instanciation explicite:: c'est quand vous dites que le compilateur pour instancier le modèle avec les types de donnée, comme ce
(explicite )spécialisation: c'est ce que vous vous référez à la spécialisation
partielle spécialisation c'est lorsque vous donnez une définition alternative à un modèle pour un sous-ensemble de types, comme ceci:
Normalement (pas de spécialisations présent) le compilateur va créer instanciations d'un modèle quand ils sont utilisés, par la substitution réel les paramètres de modèle (
int
dans votre exemple) concernant les paramètres du modèle (T
) et ensuite compiler le code résultant.Si un spécialisation est présent, pour le (des) modèle spécial paramètre(s) spécifié par cette spécialisation, que la spécialisation de la mise en œuvre doit être utilisé à la place de ce que le compilateur pourrait créer.
Un modèle de spécialisation de modifier le comportement du modèle pour un type spécifique. par exemple convertir une chaîne de caractères:
Nous allons spécialiser que si, lors de notre type est déjà un std::string comme il est inutile de passer par ostringstream
Vous pouvez spécialiser pour les classes trop.
Maintenant instanciation: ceci est fait pour vous permettre de déplacer la compilation de certains types dans une unité de compilation. Cela peut vous faire économiser le temps de compilation et parfois, le code-ballonnement de trop.
Disons que nous avons faites ci-dessus dans une classe appelée StringConvert plutôt qu'une fonction.
Nous allons convertir un lot de nombres entiers pour les chaînes de sorte que nous pouvons instancier: Mettre cela à l'intérieur d'un en-tête
Mettre cela à l'intérieur d'une unité de compilation:
Remarque que ci-dessus peut également être fait (sans le extern dans l'en-tête) avec des fonctions qui ne sont pas réellement mis en œuvre sur la ligne. L'une de vos unités de compilation permettra de les mettre en œuvre. Cependant, alors votre modèle est limitée à instancié types. Parfois lorsque le modèle a un destructeur virtuel.
Aperçu
Spécialisation: La classe, de classe ou de fonction membre, vous obtenez lors de la substitution d'arguments de modèle dans le modèle de paramètres d'un modèle de classe ou d'une fonction de modèle.
Instanciation: La loi de la création d'une spécialisation d'un modèle ou un modèle de classe membre. La spécialisation peut être créé à partir d'une spécialisation partielle, modèle de classe des membres ou en dehors d'une classe de primaire ou de la fonction de modèle.
Explicite spécialisation est celui qui définit la classe, une fonction ou un membre explicitement, sans une instanciation.
En c++ 11.
instanciation:
Instancier le modèle avec modèle donné des arguments
qui aboutissent à une définition d'une structure avec un identificateur de
test<int>
si
template <typename T> struct test
a été instancié avec l'argumentT = int
avant(explicite ou implicite), puis c'est juste une structure de l'instanciation. Sinon, il va instanciertemplate <typename T> struct test
avec l'argumentT = int
première implicitement et puis instancier une instance de structtest<int>
spécialisation:
une spécialisation est encore un modèle, vous avez encore besoin d'instanciation pour obtenir le code réel.
La plus utile de spécialisation de modèle, c'est probablement que vous pouvez créer différents modèles pour différents modèle arguments qui signifie vous pouvez avoir des définitions différentes de la classe ou de fonction pour les différents arguments de modèle.
En plus de ces modèle complet de spécialisations ci-dessus, il y a(seulement modèle de classe) sorties partielle du modèle de spécialisation aussi.
Spécialisée modèle n'est plus seulement un modèle. Au lieu de cela, c'est soit l'effectif d'une classe ou d'une fonction réelle.
Une spécialisation soit à partir d'une instanciation ou explicite de la spécialisation, cf 14.7.4 ci-dessous.
Une instanciation est basé sur un primaire définition du modèle. Un échantillon implicite de la classe d'instanciation du modèle,
Un exemple explicite de la classe d'instanciation du modèle,
Explicite spécialisation a une définition différente de son principal modèle.
//extrait de la norme
14 Modèles
14.7 instanciation du Modèle et de la spécialisation
4 Un instancié modèle de spécialisation peut être implicitement instancié (14.7.1) pour un argument donné
liste ou être instancié explicitement (14.7.2). Une spécialisation est une classe, une fonction ou un membre de la classe qui est soit
instancié ou explicitement spécialisés (article 14.7.3).