2017-10-05 7 views
2

Je peux spécialiser un destructor pour un cas, mais je vais avoir du mal à dire au compilateur d'utiliser simplement un destructor normal pour tout autre cas:Comment puis-je spécialiser un destructeur pour un seul cas, ou certains cas?

#include <iostream> 

template <int = 0> 
struct Foo 
{ 
    ~Foo(); 
}; 

int main() 
{ 
    { 
     Foo<> a; // Normal destructor called 
    } 

    { 
     Foo<7> a; // Special destructor called 
    } 

} 

template<> 
Foo<7>::~Foo() { std::cout << "Special Foo"; } 

template<> 
Foo<>::~Foo() {} // Normal destructor does nothing. 

Cela fonctionne très bien, mais maintenant si j'ajoute un autre argument de modèle par exemple Foo < 3> a; alors l'éditeur de liens dit qu'il ne peut pas trouver la définition du destructeur. Comment puis-je juste dire que je veux un destructeur spécial juste pour le numéro 7, et gérer tous les autres cas avec un destructeur normal?

J'ai essayé:

Foo::~Foo() {} // Argument list missing 

Foo<int>::~Foo() {} // Illegal type for non-type template parameter 

template<> 
Foo<int>::~Foo() {} // Same thing 

template<int> 
Foo<>::~Foo() {} // Function template has already been defined 

Répondre

4

Comment puis-je dire que je veux un destructor spécial pour le numéro 7, et manipuler tous les autres cas, avec un destructor normal?

Le destructor général devrait être défini comme:

template <int I> 
Foo<I>::~Foo() { std::cout << "general dtor"; } 

Pour

template<> 
Foo<>::~Foo() {} // Normal destructor does nothing. 

Parce que le paramètre de modèle a une valeur par défaut 0, de sorte que le code ci-dessus est juste une spécialisation de Foo<0>, juste comme ce que vous avez fait pour Foo<7>. Il est équivalent à

template<> 
Foo<0>::~Foo() {} 

LIVE

+0

Très très doux, merci. Peuvent-ils être définis en ligne dans la classe elle-même comme des fonctions de classe normales/non-basées? – Zebrafish

+0

@Zebrafish Bien sûr que oui. – songyuanyao

+0

J'ai déjà accepté votre réponse, mais j'ai du mal à la définir dans la classe comme vous l'avez dit. Si cela ne vous pose pas trop de problèmes, pourriez-vous juste donner un extrait rapide d'une définition dans le Foo struct inline? Le code est déjà configuré dans le lien LIVE que vous avez donné. – Zebrafish