I've read a long time ago (198x-9x) a book titled "midi sequencing in C" by Jim Conger, addressing all your questions. It included the source code of a complete MIDI sequencer project, built from scratch.
MIDI is a real-time protocol. The most interesting (and quite easy) aspect of MIDI is receiving and sending MIDI messages in real time. The "rtmidi" library provides exactly that (and nothing more). SMF (Standard MIDI File) is another thing, intended as an interchange format between MIDI sequencers. Parsing SMF is only a minimal part of the problem of creating a MIDI sequencer/player. The "sequencer" part means scheduling the "frozen" MIDI events to OUT ports in the right time. That involves keeping track of time very carefully, and taking into account musical elements like "tempo".
You may find "MIDI Sequencer" functionality (MIDI events scheduling) included in most operating systems, In Windows, look for midiStreamOpen() in mmsystem.h, in macOS you may want to look to MusicPlayer and MusicSequence in the AudioToolbox.framework, and in Linux, ALSA Sequencer offers similar functionality.
Finally, I'm the author of the Drumstick libraries (for Qt/C++), which you can find at Sourceforge. If you are interested in Linux, you will find a complete object-oriented wrapper around the ALSA Sequencer interfaces. Other libraries (multiplatform) are SMF parsing/writing classes (along with other sequencer formats) and realtime MIDI IO. You may also be interested in the source code examples: playsmf (command line) and guiplayer (graphical UI).
http://drumstick.sourceforge.net/docs/playsmf_8cpp-example.html
Regards,
Pedro