Forza la class del parametro del template per ereditare da un’altra class basata su modelli con parametri parzialmente soddisfatti

Quindi ho le seguenti due classi:

template  class Transformation { public: virtual Cost getCost() = 0; }; template  class State { protected: State(){ static_assert( std::is_base_of< Transformation, TransfCl >::value, "TransfCl class in State must be derived from Transformation" ); } public: virtual void apply( const TransfCl& ) = 0; }; 

Ma vorrebbe, invece, essere in grado di rilasciare il parametro Modello Cost su State , perché la funzionalità di State è completamente indipendente dal Cost . In questo modo, potrei creare classi non astratte usando una syntax simile a questa:

 class TransfImpl : public Transformation{ public: int getCost(){ return 0; } }; class StateImpl : public State{ public: StateImpl(){ static_assert( std::is_base_of::value, "TransfImpl must inherit from Transformation" ); } void apply( const TransfImpl & ){} }; 

Volevo anche associarlo a una terza class, che usava la class State -der come parametro del template, ma non avrebbe nemmeno bisogno delle classi di Transformation -derived e Cost -derived nei suoi parametri del template per verificare che la sua State class del parametro template dipendente dallo State è, infatti, derivata dallo State

Con

 template  

Puoi farlo

 template  class State { protected: static_assert(is_template_base_of::value, "TransfCl class in State must be derived from Transformation"); // previous code ... }; 

Questo soddisfa le tue necessità?

 template < class Cost > class Transformation { public: typedef Cost TransformationCost; virtual Cost getCost() = 0; }; template < class TransfCl, class Cost = typename TransfCl::TransformationCost> class State { static_assert( std::is_base_of< Transformation< Cost >, TransfCl >::value, "TransfCl class in State must be derived from Transformation< Cost >" ); protected: State(){} public: virtual void apply( const TransfCl& ) = 0; }; class TransfImpl : public Transformation< int >{ public: int getCost(){ return 0; } }; class StateImpl : public State< TransfImpl >{ public: StateImpl(){} void apply( const TransfImpl & ){} }; 

AGGIUNTO : Live Demo