Другой вариант заключается в получении из шаблона маркеров
struct Base { /* ... */ };
template<typename T>
struct BaseOutputtable {
T *getDerived() {
return static_cast<T*>(this);
}
T const *getDerived() const {
return static_cast<T const*>(this);
}
protected:
~BaseOutputtable() { }
};
Затем вывести их из обоих
struct MyDerived : Base, BaseOutputtable<MyDerived> {
/* ... */
};
Теперь вы можете записать его в виде
template<typename Derived>
ostream &operator<< (ostream &o, BaseOutputtable<Derived> &derived) {
/* ... */
}
Преимуществом этого является его простота. И если Base
уже шаблонный это еще более полезным (я понимаю, что это не так, для вашего кода).