2012-10-21 12 views
5

Sono una situazione che è come questo esempio inventato:Come dichiarare un self riferimento modello di tipo

template<class TFeature> struct Controller {}; 

template<class TController,typename T> struct Feature { 
    typedef Feature<TController,T> FeatureType; 
}; 

typedef Controller<Feature::FeatureType,int> DefaultController; 

Il controller è basato su modelli di accettare le caratteristiche e il mio problema è che alcune delle caratteristiche del tipo di bisogno il controller come parametro del template. Ciò non compila il typedef sull'ultima riga del campione.

È possibile o devo ripensare il progetto?

+1

@RondogiannisAristophanes, penso che è il punto della questione. – bdonlan

+0

Perché non puoi dichiarare 'FeatureType' al di fuori della struttura? – alestanis

+1

-1 il codice presentato è * non valido *, utilizzando due argomenti del modello effettivi per uno formale. è anche * priva di significato *, con 'Feature' che corrisponde a se stesso come' FeatureType'. –

risposta

2

Per ottenere ciò, è necessario eseguire alcune metamai di programmazione (e credetemi, non è un compito facile). Ma se davvero nead e utilizzando boost è un'opzione per voi dare un'occhiata a boost::mpl e si può avere qualcosa di simile:

template< class ControlerT > 
struct FeatureEx { 
    typedef ControlerT controler_type; 
}; 
template< class FeatureT > 
struct ControlerEx { 
    typedef ControlerEx<FeatureT> this_type; 
    typedef typename boost::mpl::apply< 
     FeatureT, boost::mpl::identity<this_type> 
    >::type feature_type; 

    feature_type const& get_feature() const {return f_;} 

private: 
    feature_type f_; 
}; 

typedef ControlerEx<FeatureEx<boost::mpl::placeholders::_1> > DefaultControler; 
+0

Credo che questo sia l'approccio che potrebbe funzionare per me e l'ho contrassegnato come la mia risposta accettata. Grazie mille a tutti coloro che hanno avuto il tempo di rispondere. –

0

Una possibilità sarebbe quella di utilizzare una sottoclasse fittizio al posto di un typedef:

struct DefaultController : public Controller<Feature<DefaultController,int>::FeatureType> {}; 
1

Si passa alle Controller classe due parametri di modello, ma hanno dichiarato di prendere una sola. Hai bisogno di qualcosa di simile al seguente?

typedef Controller<Feature<Controller<int>,int>::FeatureType> DefaultController; 
0

Sembra che tu stia cercando di passare 2 parametri al tuo modello di Controller, mentre può accettarne solo uno.

Problemi correlati