目前,我正在为一个作为相机驱动程序的C库编写C++包装器。相机可以设置属性,这些属性可以是float
、bool
或int
类型。每个属性都有一个ID,该ID是enum PropId
的成员。对于这些类型中的每一个,都有一个属性信息struct
,一个用于获取和设置值的函数:
GetPropertyAttribsI
GetPropertyAttribsB
GetPropertyAttribsF
PropAttribsI
PropAttribsF
PropAttribsB
SetPropertyValueI
SetPropertyValueF
SetPropertyValueB
我的问题是,我想编写代码来实现以下功能:
- 检查要设置的属性值是否在范围内,如果不在范围内,则将其设置为默认值。 范围和默认值可以在
PropAttribs 结构体
中查找,该结构体可以使用相应的GetPropertyAttribs
函数进行初始化。 - 使用相应的
SetPropertyValue(I,B,F)
设置属性
我可以查找属性的类型,它在一个 枚举 (PROP_TYPE_INT、PROP_TYPE_FLOAT、PROP_TYPE_BOOL)
中。
因此,我需要一个函数:
checkAndSanitizeProperty(T& value, PropId property)
检查给定属性是否在范围内,否则将其设置为默认值。
骨架应该是以下内容,但我不知道如何使用模板参数使其对bool
和float
都可用而不需要复制。设置参数的函数与此非常相似,如果找到任何解决方案,则应具有相同的解决方案。
void CameraHandle::checkAndSanitizeProperty(int& value, VRmPropId property, std::string name) {
VRmPropInfo propInfo;
VRM_CHECK(VRmUsbCamGetPropertyInfo(device, property, &propInfo));
if (VRM_PROP_TYPE_INT != propInfo.m_type) {
ROS_ERROR("Invalid type of property!");
}
VRmPropAttribsI attribs;
VRmUsbCamGetPropertyAttribsI(device, property, &attribs);
if (value < attribs.m_min || value > attribs.m_max) {
ROS_WARN("Invalid value for parameter %s, has to be in [%d,%d], but was: %d",
name.c_str(),
attribs.m_min,
attribs.m_max,
value);
ROS_WARN("Default will be used for %s: %d", name.c_str(), attribs.m_default);
value = attribs.m_default;
}
}
让我感到烦恼的是我需要重复很多代码,因此我在寻找更简洁的解决方案。我并不主要使用C++,所以对于模板魔法或C++惯用语并没有太多经验。