C++11 这个CStringArray可以用c++;11? 值得吗?

C++11 这个CStringArray可以用c++;11? 值得吗?,c++11,mfc,C++11,Mfc,这听起来可能是一个简单的问题,但我正试图了解c++11中新功能的好处。因此,考虑到这种方法: CString CMeetingScheduleAssistantApp::GetHtmlLanguageCode() { CStringArray aryStrLangId; aryStrLangId.Add(_T("en")); aryStrLangId.Add(_T("de")); aryStrLangId.Add(_T("es")); aryStrLan

这听起来可能是一个简单的问题,但我正试图了解c++11中新功能的好处。因此,考虑到这种方法:

CString CMeetingScheduleAssistantApp::GetHtmlLanguageCode()
{
    CStringArray aryStrLangId;

    aryStrLangId.Add(_T("en"));
    aryStrLangId.Add(_T("de"));
    aryStrLangId.Add(_T("es"));
    aryStrLangId.Add(_T("it"));
    aryStrLangId.Add(_T("pl"));
    aryStrLangId.Add(_T("fr"));
    aryStrLangId.Add(_T("pt"));
    aryStrLangId.Add(_T("nl"));
    aryStrLangId.Add(_T("sv"));
    aryStrLangId.Add(_T("sl"));
    aryStrLangId.Add(_T("cs"));
    aryStrLangId.Add(_T("fi"));
    aryStrLangId.Add(_T("da"));
    aryStrLangId.Add(_T("uk"));
    aryStrLangId.Add(_T("ru"));
    aryStrLangId.Add(_T("tl"));
    aryStrLangId.Add(_T("ht"));
    aryStrLangId.Add(_T("af"));
    aryStrLangId.Add(_T("sq"));
    aryStrLangId.Add(_T("zh-Hans"));
    aryStrLangId.Add(_T("hr"));
    aryStrLangId.Add(_T("tr"));
    aryStrLangId.Add(_T("tw"));
    aryStrLangId.Add(_T("sw"));
    aryStrLangId.Add(_T("et"));
    aryStrLangId.Add(_T("ro"));
    aryStrLangId.Add(_T("el"));
    aryStrLangId.Add(_T("bg"));
    aryStrLangId.Add(_T("mg"));
    aryStrLangId.Add(_T("ar"));
    aryStrLangId.Add(_T("id"));
    aryStrLangId.Add(_T("hi"));
    aryStrLangId.Add(_T("ta"));
    aryStrLangId.Add(_T("vi"));
    aryStrLangId.Add(_T("zu"));
    aryStrLangId.Add(_T("guw")); // AJT v17.0.9 Gun 
    aryStrLangId.Add(_T("ln")); // AJT v17.0.9 Lingala
    aryStrLangId.Add(_T("pt")); // AJT v17.0.9 Portuguese Portugal
    aryStrLangId.Add(_T("pa")); // AJT v17.1.3 Punjabi

    return aryStrLangId.GetAt(GetProgramLanguage());
}
它不难维护,但是可以将其更改为一组更简单的代码吗?它只是一个字符串列表,返回给定索引位置的值


谢谢。

我认为MFC对
std::initializer\u list
一无所知,但您可以提升新(旧)for range循环:

CString CMeetingScheduleAssistantApp::GetHtmlLanguageCode()
{
  constexpr const char* languages[] = { "en", "de", "es" ... };
  CStringArray aryStrLangId;
  for (auto lang : languages){
    aryStrLangId.Add(lang);
  }

   return aryStrLangId.GetAt(GetProgramLanguage());
}

这样,您就不会因为对
Add

思想的不必要调用而使代码膨胀。如果您有一个语言数组,那么我们不需要CStringArray。只需返回常量数组的索引位置即可。上面的代码可以在没有c++11的情况下重写。for循环+auto+constexpr的范围使其成为c++11。您可以使用旧的基于索引的迭代,但这是最简单(也是最安全的,因为您需要知道数组大小)的方法。