CRTP: Curiously recurring template pattern
Motivation:
Instead of every derived class having to implement the getSomeClass() method, I want by static polymorphism the base class to do it more or less in a way outlined in the code commented out in the base class.
In the example below, the derived class is a template class, I guess that's not important for the solution, but anyways, that's how I need it to be in my case.
Anybody having an idea of how to achieve my goal?
base_and_derived.h
===============
// --------------------------------------------
template <int J>
class SomeClasss{
};
// --------------------------------------------
template <template <int> class DERIVED>
class Base {
public:
/*
// I want, but cannot get it to work:
typedef DERIVED::my_type same_type_higher_up;
*/
/*
// I want, but cannot get it to work:
same_type_higher_up *getInstanceOfSameTypeHigherUp() const {
return new same_type_higher_up();
}
*/
};
// --------------------------------------------
template <int I>
class Derived : public Base<Derived> {
public:
typedef SomeClasss<I> my_type;
public:
my_type *getSomeClass() const{
return new my_type();
}
};
// --------------------------------------------
main.cpp
=======
#include "base_and_derived.h"
int _tmain(int argc, _TCHAR* argv[])
{
// Works fine:
Derived<7> *derived = new Derived<7>();
Derived<7>::my_type *someClassInstance = derived->getSomeClass();
delete someClassInstance;
delete derived;
/*
// I want, but cannot get it to work:
Derived<7> *derived = new Derived<7>();
Derived<7>::same_type_higher_up *instanceOfSameTypeHigherUp = derived->getInstanceOfSameTypeHigherUp();
delete instanceOfSameTypeHigherUp;
delete derived;
*/
}
// --------------------------------------------
Motivation:
Instead of every derived class having to implement the getSomeClass() method, I want by static polymorphism the base class to do it more or less in a way outlined in the code commented out in the base class.
In the example below, the derived class is a template class, I guess that's not important for the solution, but anyways, that's how I need it to be in my case.
Anybody having an idea of how to achieve my goal?
base_and_derived.h
===============
// --------------------------------------------
template <int J>
class SomeClasss{
};
// --------------------------------------------
template <template <int> class DERIVED>
class Base {
public:
/*
// I want, but cannot get it to work:
typedef DERIVED::my_type same_type_higher_up;
*/
/*
// I want, but cannot get it to work:
same_type_higher_up *getInstanceOfSameTypeHigherUp() const {
return new same_type_higher_up();
}
*/
};
// --------------------------------------------
template <int I>
class Derived : public Base<Derived> {
public:
typedef SomeClasss<I> my_type;
public:
my_type *getSomeClass() const{
return new my_type();
}
};
// --------------------------------------------
main.cpp
=======
#include "base_and_derived.h"
int _tmain(int argc, _TCHAR* argv[])
{
// Works fine:
Derived<7> *derived = new Derived<7>();
Derived<7>::my_type *someClassInstance = derived->getSomeClass();
delete someClassInstance;
delete derived;
/*
// I want, but cannot get it to work:
Derived<7> *derived = new Derived<7>();
Derived<7>::same_type_higher_up *instanceOfSameTypeHigherUp = derived->getInstanceOfSameTypeHigherUp();
delete instanceOfSameTypeHigherUp;
delete derived;
*/
}
// --------------------------------------------