I am using a similar system, which supports both buttons and axises (what is the english plural for axis ?). Axises can be used to handle mouse coordinates or analog sticks on a gamepad. You can Bind and Unbind certain keycodes (or axiscodes) like N3DKEY_ESCAPE or N3DKEY_SPACE to a slot with a number between 0..31.
In consequence, you can call KeyState(Slot) or AxisState(Slot) to retrieve a keystate (Press, Pressed, Release, Released) for the key's or a Float value between 0..1 for the axises. Finally, the module can also handle text input.

My system is based on DirectInput, but I might make a similar system with SDL in the future.

You're code looks good, but I don't need it ATM.