Don't really need dynamic_cast. Up to user to ensure template arguments are valid type