class Derived;
// mock object
struct SomeSingleton
{
static void RegisterThisObject(int type_id) {}
};
namespace detail
{
template <class T> struct registerable_traits { };
template<> struct registerable_traits<Derived>
{
enum _id { type_id = 1 };
};
}
template <class T>
class Base
{
protected: // note change
Base() { SomeSingleton::RegisterThisObject(detail::registerable_traits<T>::type_id); }
};
class Derived : Base<Derived>
{
public:
Derived(): Base<Derived>(){};
};
int main()
{
Derived d;
return 0;
}