在方法中构造一个std:映射一次

Constructing a std:map only once within a method

本文关键字:std 一次 映射 一个 方法      更新时间:2023-10-16

我有此静态方法:

CString COutlookCalendarSettingsDlg::GetExitCodeAsString(DWORD dwExitCode)
{
    using OutlookExitCodesMap = std::map<DWORD, CString>;
    OutlookExitCodesMap mapExitCodes;
    mapExitCodes.insert(std::pair<DWORD, CString>(1, _T("NoError")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-1, _T("CommandLineArguments")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-2, _T("BuildingCalendarList")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-3, _T("CalendarEventsPathNullEmpty")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-4, _T("CalendarEventsPathNotFound")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-5, _T("ModeSwitchNotSpecified")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-6, _T("ModeSwitchInvalid")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-7, _T("AddEventsMWB")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-8, _T("AddEventsSRR")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-9, _T("SignOut")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-10, _T("ReadMWBData")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-11, _T("ReadSRRData")));
    return mapExitCodes[dwExitCode];
}

现在,我知道我可以将其转变为类中的全局变量,然后将GetExitCodeAsString方法从此全局变量中返回。

但是如何将地图定义在方法中,但是,只构建一次呢?我不需要继续重建它。因此,它首次被称为它会构造它,随后的时间它将仅返回值。

可以做到吗?

答案很简单,但丑陋:

CString COutlookCalendarSettingsDlg::GetExitCodeAsString(DWORD dwExitCode)
{
  using OutlookExitCodesMap = std::map<DWORD, CString>;
  static OutlookExitCodesMap mapExitCodes;
  if (mapExitCodes.size()==0)
  {
    mapExitCodes.insert(std::pair<DWORD, CString>(1, _T("NoError")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-1, _T("CommandLineArguments")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-2, _T("BuildingCalendarList")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-3, _T("CalendarEventsPathNullEmpty")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-4, _T("CalendarEventsPathNotFound")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-5, _T("ModeSwitchNotSpecified")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-6, _T("ModeSwitchInvalid")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-7, _T("AddEventsMWB")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-8, _T("AddEventsSRR")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-9, _T("SignOut")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-10, _T("ReadMWBData")));
    mapExitCodes.insert(std::pair<DWORD, CString>(-11, _T("ReadSRRData")));
  }
  return mapExitCodes[dwExitCode];
}

此代码对于多线程不安全。另外,如果有未知的出口码,地图就会成长。无需这个...

但是为什么要使用地图作为如此简单的代码。更简单,不使用任何堆,甚至任何结构:

CString COutlookCalendarSettingsDlg::GetExitCodeAsString(DWORD dwExitCode)
{
  using OutlookExitCodesMap = std::map<DWORD, CString>;

  static const struct { 
    int     dwCode;
    LPCTSTR pszText;
  } 
  aMap[] = 
  {
    1, _T("NoError"),
    -1, _T("CommandLineArguments"),
    -2, _T("BuildingCalendarList"),
    -3, _T("CalendarEventsPathNullEmpty"),
    -4, _T("CalendarEventsPathNotFound"),
    -5, _T("ModeSwitchNotSpecified"),
    -6, _T("ModeSwitchInvalid"),
    -7, _T("AddEventsMWB"),
    -8, _T("AddEventsSRR"),
    -9, _T("SignOut"),
    -10, _T("ReadMWBData"),
    -11, _T("ReadSRRData"),
  };
  for (const auto &data : aMap)
  {
    if (static_cast<DWORD>(data.dwCode)==dwExitCode)
       return data.pszText;
  }
  return CString();
}

代码可能具有错别字...我刚刚从头开始写

这是基于我问题提供的评论的另一个解决方案:

CString COutlookCalendarSettingsDlg::GetExitCodeAsString(DWORD dwExitCode)
{
    switch (dwExitCode)
    {
    case 1: return _T("NoError");
    case -1: return _T("CommandLineArguments");
    case -2: return _T("BuildingCalendarList");
    case -3: return _T("CalendarEventsPathNullEmpty");
    case -4: return _T("CalendarEventsPathNotFound");
    case -5: return _T("ModeSwitchNotSpecified");
    case -6: return _T("ModeSwitchInvalid");
    case -7: return _T("AddEventsMWB");
    case -8: return _T("AddEventsSRR");
    case -9: return _T("SignOut");
    case -10: return _T("ReadMWBData");
    case -11: return _T("ReadSRRData");
    }
return CString();

}