我有兩個結構:
S_BETHEL_SPEAKER_SERVICE_TALK_INFOS_MEMORIAL_INFO
而且,目前我有兩種不同的方法,如下所示:
void CMeetingScheduleAssistantApp::UpdateBethelServiceTalkInfo(COleDateTime datSpecialEvent, const S_BETHEL_SPEAKER_SERVICE_TALK_INFO sBSSTI)
{
const CString strDateKey = datSpecialEvent.Format(_T("%Y-%m-%d"));
if (m_mapSpecialEvents.find(strDateKey) != m_mapSpecialEvents.end())
{
S_SPECIAL_EVENT sEvent = m_mapSpecialEvents[strDateKey];
sEvent.sBSSTI = sBSSTI;
m_mapSpecialEvents[strDateKey] = sEvent; // Update
SaveEventsList();
}
}
void CMeetingScheduleAssistantApp::UpdateMemorialInfo(COleDateTime datSpecialEvent, const S_MEMORIAL_INFO sMI)
{
const CString strDateKey = datSpecialEvent.Format(_T("%Y-%m-%d"));
if (m_mapSpecialEvents.find(strDateKey) != m_mapSpecialEvents.end())
{
S_SPECIAL_EVENT sEvent = m_mapSpecialEvents[strDateKey];
sEvent.sMI = sMI;
m_mapSpecialEvents[strDateKey] = sEvent; // Update
SaveEventsList();
}
}
如您所見,它們實際上是相同的。是否可以通過模板將這兩個功能合二為一?
uj5u.com熱心網友回復:
這可以通過將函式轉換為函式模板并為賦值提供多載來實作。唯一的要求是S_BETHEL_SPEAKER_SERVICE_TALK_INFO和S_MEMORIAL_INFO是不同的型別(與同一型別的型別別名相反)。
分配的多載可以在S_SPECIAL_EVENT. 下面的實作利用了通常所說的隱藏朋友。應該執行以下操作:
struct S_SPECIAL_EVENT {
// ...
private:
// Assignment overloads
friend inline void assign(S_SPECIAL_EVENT& event,
S_BETHEL_SPEAKER_SERVICE_TALK_INFO info) {
event.sBSSTI = info;
}
friend inline void assign(S_SPECIAL_EVENT& event,
S_MEMORIAL_INFO info) {
event.sMI = info;
}
};
有了它,您就可以繼續實作功能模板:
template<typename T>
void CMeetingScheduleAssistantApp::UpdateEventInfo(COleDateTime datSpecialEvent,
T info)
{
const CString strDateKey = datSpecialEvent.Format(_T("%Y-%m-%d"));
if (m_mapSpecialEvents.find(strDateKey) != m_mapSpecialEvents.end())
{
S_SPECIAL_EVENT sEvent = m_mapSpecialEvents[strDateKey];
assign(sEvent, info);
m_mapSpecialEvents[strDateKey] = sEvent; // Update
SaveEventsList();
}
}
或者,由于您正在更新現有值,您可以就地更新它,例如:
template<typename T>
void CMeetingScheduleAssistantApp::UpdateEventInfo(COleDateTime datSpecialEvent,
T info)
{
const CString strDateKey = datSpecialEvent.Format(_T("%Y-%m-%d"));
if (m_mapSpecialEvents.find(strDateKey) != m_mapSpecialEvents.end())
{
assign(m_mapSpecialEvents[strDateKey], info);
SaveEventsList();
}
}
如果m_mapSpecialEvents是 astd::map并且您可以訪問 C 20 編譯器,則可以利用以下優勢進一步收緊代碼contains():
template<typename T>
void CMeetingScheduleAssistantApp::UpdateEventInfo(COleDateTime datSpecialEvent,
T info)
{
const CString strDateKey = datSpecialEvent.Format(_T("%Y-%m-%d"));
if (m_mapSpecialEvents.contains(strDateKey))
{
assign(m_mapSpecialEvents[strDateKey], info);
SaveEventsList();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/519916.html
標籤:模板视觉-C mfc
