I know there are some some pitfalls when mixing inheritance and templates, but I'd like to know if the code below (which compiles and seems to run well) is "legal" and wellformed.
struct ISession {
virtual ~ISession() = deafult;
virtual void run() = 0;
};
template <typename Derived>
struct SessionBase : public ISession {
SessionBase() {
static_assert(is_base_of_v<SessionBase<Derived>, Derived>);
}
void run() override {
derived().connect();
}
Derived& derived() {
return static_cast<Derived&>(*this);
}
};
struct PlainSession : public SessionBase<PlainSession> {
void connect() {
// do connect plain
}
};
struct SslSession : public SessionBase<SslSession> {
void connect() {
// do connect ssl
}
};
int main(int argc, char *argv[])
{
list<unique_ptr<ISession>> sessions;
sessions.emplace_back(make_unique<PlainSession>());
sessions.emplace_back(make_unique<SslSession>());
for_each(sessions.begin(), sessions.end(), [](auto& session) { session->run(); });
}