So I have the following two classes:
template < class Cost >
class Transformation {
public:
virtual Cost getCost() = 0;
};
template < class TransfCl, class Cost >
class State {
protected:
State(){
static_assert(
std::is_base_of< Transformation< Cost >, TransfCl >::value,
"TransfCl class in State must be derived from Transformation< Cost >"
);
}
public:
virtual void apply( const TransfCl& ) = 0;
};
But would like to, instead, be able to drop the Cost
template parameter to State
, because State
's functionality is completely independent of Cost
. This way, I could create non-abstract classes using a syntax similar to this:
class TransfImpl : public Transformation< int >{
public: int getCost(){ return 0; }
};
class StateImpl : public State< TransfImpl >{
public:
StateImpl(){
static_assert(
std::is_base_of< Transformation, TransfImpl >::value,
"TransfImpl must inherit from Transformation< Cost >"
);
}
void apply( const TransfImpl & ){}
};
I also wanted to eventually chain this to a third class, which would use the State
-derived class as its template parameter, but wouldn't need to also have the Transformation
-derived and Cost
-derived classes in its template parameters to verify that its State
-derived template parameter class is, in fact, derived from State