Maison  >  Article  >  développement back-end  >  Spécialisation de modèle et spécialisation partielle de modèle en C++ ?

Spécialisation de modèle et spécialisation partielle de modèle en C++ ?

WBOY
WBOYoriginal
2024-05-08 17:33:01841parcourir

La spécialisation des modèles et la spécialisation partielle sont des mécanismes uniques en C++. Les spécialisations de modèles fournissent des implémentations spécifiques pour des types spécifiques de paramètres de modèle, tandis que les spécialisations partielles de modèles permettent de saisir des modèles en fonction de certains paramètres de modèle, ce qui rend leur utilisation plus flexible. Les spécialisations de modèle utilisent la syntaxe de modèle, tandis que les spécialisations partielles de modèle utilisent la syntaxe de modèle

Spécialisation de modèle et spécialisation partielle de modèle en C++ ?

Spécialisation de modèle et spécialisation partielle de modèle en C++

Spécialisation de modèle

La spécialisation de modèle fait référence à la fourniture explicite d'une implémentation de modèle spécifique pour un type spécifique de paramètre de modèle. La syntaxe est la suivante :

template <>
class MyClass<MyType> {
  // 特化代码
};

Exemple :

template <typename T>
class MyClass {
  T value;

public:
  MyClass(T v) : value(v) {}
  T getValue() { return value; }
};

template <>
class MyClass<int> {
  int value;

public:
  MyClass(int v) : value(v) {}
  int getValue() { return value * 2; }
};

int main() {
  MyClass<string> strObj("Hello");
  cout << strObj.getValue() << endl;

  MyClass<int> intObj(5);
  cout << intObj.getValue() << endl;
}

Sortie :

Hello
10

Spécialisation partielle de modèle

Une spécialisation partielle de modèle est une spécialisation de modèle spéciale qui permet de saisir des modèles en fonction d'une partie du paramètres du modèle. La syntaxe est la suivante :

template <typename T, typename U>
class MyClass {
  // ...
};

template <typename T>
class MyClass<T, T> {
  // 偏特化代码
};

Exemple :

template <typename T, typename U>
class MyClass {
  T value1;
  U value2;

public:
  MyClass(T v1, U v2) : value1(v1), value2(v2) {}
  T getValue1() { return value1; }
  U getValue2() { return value2; }
};

template <typename T>
class MyClass<T, T> {
public:
  MyClass(T v) : value1(v), value2(v) {}
  T getValue1() { return value1; }
  T getValue2() { return value2; }
};

int main() {
  MyClass<string, int> strIntObj("Hello", 5);
  cout << strIntObj.getValue1() << ", " << strIntObj.getValue2() << endl;

  MyClass<int> intObj(10);
  cout << intObj.getValue1() << ", " << intObj.getValue2() << endl;
}

Sortie :

Hello, 5
10, 10

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn