Specializzazione parziale classe template

di il
3 risposte

Specializzazione parziale classe template

Salve Ragazzi, sono nuovo nel paradigma object oriented ed avrei bisogno di una mano.
ho una classe template tipo la seguente

template <template <class> class Nodetype,class ElementType>
class myclass
{
public:
 void insert(ElementType value, int pos);

private:
Nodetype<ElementType> * mypoint;

}
ora il problema avviene nella specializzazione di alcuni metodi della stessa, mi spiego meglio. Finchè specifico completamente nessun problema( uso ad esempio
 template<>  void myclass<linkedNode, int >::insert (int value,int pos){ ecc ecc} 
... )vorrei fare la stessa cosa mantenendo il parametro di classe ElementType, ma utilizzando una scrittura del tipo

template<class ElementType>
void myclass<LinkedNode,ElementType>::insert(ElementType value,int pos){ ecc ecc} 
ovviamente il compilatore mi genera errore... Qualcuno può aiutarmi a realizzare questo? Non riesco a trovare nulla in giro..vi prego!

3 Risposte

  • Re: Specializzazione parziale classe template

    Devi specializzare la classe.
    
    template <class ElementType>
    class linkedNode {};
    
    template <class ElementType>
    class arrayNode {};
    
    template <template <class> class Nodetype, class ElementType>
    class myclass {
    public:
    	void insert(ElementType value, int pos);
    private:
    	Nodetype<ElementType> * mypoint;
    };
    
    template <class ElementType>
    class myclass<linkedNode,ElementType> {
    public:
    	void insert(ElementType value, int pos);
    private:
    	linkedNode<ElementType> * mypoint;
    };
    
    template <class ElementType>
    class myclass<arrayNode, ElementType> {
    public:
    	void insert(ElementType value, int pos);
    private:
    	arrayNode<ElementType> * mypoint;
    };
    
    template<typename ElementType>  
    inline void myclass<linkedNode, ElementType>::insert(ElementType value, int pos) { /*ecc ecc*/ }
    
    template<typename ElementType>
    inline void myclass<arrayNode, ElementType>::insert(ElementType value, int pos) { /*ecc ecc*/ }
    
    int main(int argc, char* argv[]) {
    	myclass<linkedNode,int> c;
    	c.insert(1,2);
    
    	myclass<arrayNode, int> d;
    	d.insert(1, 2);
    }
    
  • Re: Specializzazione parziale classe template

    Ti ringrazio per il prezioso aiuto. Per quanto riguarda i metodi più generali che non necessitano specializzazioni particolari possono essere implementati nella classe generale senza dover necessariamente scrivere lo stesso codice nelle varie specializzazioni?
  • Re: Specializzazione parziale classe template

    No, purtroppo devi scrivere sia i metodi delle classi generali sia di quelle specializzate. Con i template ogni singola specializzazione è una classe a se.
    Sarà il compilatore a scegliere quale sia più adatta al contesto di chiamata.
Devi accedere o registrarti per scrivere nel forum
3 risposte