c++ - 构建标准 :map only once within a method

标签 c++ mfc stdmap

我有这个静态方法:

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 方法以从该全局变量返回。

但是我怎样才能在方法中定义 map ,但是,只构造一次呢?我不需要继续重建它。因此,它会在第一次被调用时构造它,随后它只会返回值。

这可以做到吗?

最佳答案

答案很简单但丑陋:

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];
}

这段代码对于多线程来说是不安全的。此外,如果存在未知的退出代码,则 map 会增长。不需要这个...

但为什么要为如此简单的代码使用 map 。更简单,不使用任何堆,甚至不使用任何构造:

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();
}

代码可能有错别字……我是从头开始写的

关于c++ - 构建标准 :map only once within a method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46235085/

相关文章:

c++ - 从 SYSTEMTIME 到 time_t 的转换给出 UTC/GMT 时间

c++ - std::map::size_type 对于 std::map 其 value_type 是它自己的 size_type

c++ - 使用 Cygwin 编译 c++ wxWidgets

c++ - 处理 MySQL C++ 连接器上丢失的 TCP 连接

c++ - 当只需要一个成员特化时如何避免重复整个类模板

c++ - 为什么 DECLARE_DYNAMIC 和 IMPLEMENT_DYNAMIC 对 DYNAMIC_DOWNCAST 是必要的?

c++ - 顶行右对齐的 MFC 工具栏

c++ - 使用 char* 变量查找不起作用

c++ - 使用包含键和结构的映射执行 set_intersection 时出错

c++ - 为什么保留额外内存时 vector 中的对象没有 move ?