當前,我爲C-Library編寫了一個C++包裝器,該C-Library作爲相機的驅動程序。相機可以設置屬性,可以是float
,bool
或int
。每個酒店都有一個身份證,該證件是enum PropId
的成員。對於這些類型的,還有一個屬性信息struct
,一個函數來獲取和設置值:將類型作爲枚舉類型的C-API封裝在C++中
GetPropertyAttribsI
GetPropertyAttribsB
GetPropertyAttribsF
PropAttribsI
PropAttribsF
PropAttribsB
SetPropertyValueI
SetPropertyValueF
SetPropertyValueB
我的問題是,現在我要編寫代碼:
- 檢查是否要設置的屬性值在範圍內,否則將其設置爲默認值。邊界和默認值可以在
PropAttribs struct
中查找,可以使用相應的GetPropertyAttribs
函數進行初始化。 - 設置屬性與相應
SetPropertyValue(I,B,F)
我可以看一下屬性的類型,它是在enum (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++習慣用法沒有太多的經驗。
這看起來很酷。不幸的是,我認爲它比簡單地複製每種類型的函數的可讀性和可維護性都差。 – reindeer
@reindeer如果您只有1或2個函數,那麼編寫手工生成的宏比使用上述宏更好。最後你會得到一個統一的商業邏輯功能,這很好。 – Yakk