2017-09-18 4 views
4

Je cherche à écrire un programme qui génère 1 à 1000 sans une boucle ou un appel de fonction récursive, et je viens avec ceSpécialiser une classe de modèle?

#include <iostream> 

template <int N> 
class NumberGenerator : public NumberGenerator<N-1>{ 
    public: 
    NumberGenerator(); 
}; 

template <int N> 
NumberGenerator<N>::NumberGenerator(){ 
    // Let it implicitly call NumberGenerator<N-1>::NumberGenerator() 
    std::cout << N << std::endl; 
} 

template <> 
NumberGenerator<1>::NumberGenerator(){ 
    // How do I stop the implicit call? 
    std::cout << 1 << std::endl; 
} 

int main(){ 
    NumberGenerator<1000> a; // Automatically calls the constructor 
    return 0; 
} 

Le problème est, je ne peux pas arrêter l'appel de la chaîne (NumberGenerator<1> encore tente d'appeler NumberGenerator<0> et de déborder à l'infini). Comment puis-je faire arrêter la chaîne à 1?

Répondre

3

le modèle de spécialiser la classe elle-même:

template <int N> 
class NumberGenerator : public NumberGenerator<N-1>{ 
    public: 
    NumberGenerator(); 
}; 

template <> 
class NumberGenerator<1> { 
    public: 
    NumberGenerator(); 
}; 
+0

Vais-je être en mesure d'utiliser d'autres fonctions de la classe 'NG pas spécialisées <1>'? C'est à dire. fait 'vide NG :: foo()' couverture 'NG <1>'? – iBug

+0

Erm. J'espère que cela t'aides? http://coliru.stacked-crooked.com/a/dabc1b56b56e3848 – sehe

+0

Non, vous ne serez pas en mesure d'utiliser les autres fonctions. Pour arrêter la chaîne, vous DEVEZ supprimer la classe de base. Il n'y a pas moyen de contourner cela 1. programmation de méta de modèle (bonne chance) 2. spécialisant le modèle de classe – sehe