Use of curiously recursive template pattern (CRTP) to dispatch GetRangeImpl and SetRangeImpl at compile time. Override all virtual functions for the supported types and will handle the conversion between "U" the incoming type and "T" the underlying type.