我有这个定义:

using ToolTipMap = std::map<UINT, UINT>;
using ToolTipPair = std::pair<UINT, UINT>;

我这样使用它:
ToolTipMap mapToolTips;
mapToolTips.insert(ToolTipPair(IDC_COMBO_WATCHTOWER_DAY, IDS_COMBO_WATCHTOWER_DAY));
mapToolTips.insert(ToolTipPair(IDC_COMBO_SCHOOL_DAY, IDS_COMBO_SCHOOL_DAY));
mapToolTips.insert(ToolTipPair(IDC_EDIT_DATE_FORMAT, IDS_EDIT_DATE_FORMAT));
mapToolTips.insert(ToolTipPair(IDC_CHECK_USE_CUSTOM_DATE, IDS_CHECK_USE_CUSTOM_DATE));
mapToolTips.insert(ToolTipPair(IDC_CHECK_PLATFORM, IDS_CHECK_PLATFORM));
mapToolTips.insert(ToolTipPair(IDC_CHECK_PLATFORM_MIKE, IDS_CHECK_PLATFORM_MIKE));
mapToolTips.insert(ToolTipPair(IDC_COMBO_NUM_MIKE_USERS, IDS_COMBO_NUM_MIKE_USERS));
mapToolTips.insert(ToolTipPair(IDC_COMBO_NUM_SOUND_USERS, IDS_COMBO_NUM_SOUND_USERS));
mapToolTips.insert(ToolTipPair(IDC_COMBO_NUM_ATTEND, IDS_COMBO_NUM_ATTEND));
mapToolTips.insert(ToolTipPair(IDC_BUTTON_HELP, IDS_BUTTON_HELP));
mapToolTips.insert(ToolTipPair(IDC_COMBO_REPORT_MODE, IDS_COMBO_REPORT_MODE));
mapToolTips.insert(ToolTipPair(IDC_COMBO_WEEKLY_DAY, IDS_COMBO_WEEKLY_DAY));

我如何简化这一点:
IDC_COMBO_WATCHTOWER_DAY, IDS_COMBO_WATCHTOWER_DAY

因此,我只指定:
COMBO_WATCHTOWER_DAY

并随着两个宏一起扩展?

我看到:
  • #将参数转换为文本字符串
  • ##结合了两个参数

  • 所以:
    TOOLTIP(a) _T(“IDC_”)#a _T(“IDS_”)#a
    

    最佳答案

    您可以使用std::map::emplace简化代码,例如

    ToolTipMap.emplace(1, 2);
    

    或使用ToolTipMap.insert({ 1, 2 });避免需要std::pair
    使用#define foo(x) IDC_##x, IDS_##x作为IDC_x, IDS_x的快捷方式
    #include <iostream>
    #include <map>
    
    #define IDC_X1 1
    #define IDS_X1 1000
    
    #define IDC_X2 2
    #define IDS_X2 2000
    
    int main()
    {
        std::map<int, int> ToolTipMap;
    
    #define foo(x) IDC_##x, IDS_##x
        ToolTipMap.emplace(foo(X1));
        ToolTipMap.emplace(foo(X2));
    #undef foo
    
        for (const auto &e : ToolTipMap)
            std::cout << e.first << ", " << e.second << "\n";
    
        return 0;
    }
    

    如果您没有更多的这些常量,我建议保留原样。您可以复制/粘贴行,而无需复杂的宏。最终的代码大小将相同,因此不会有任何损失。

    关于c++ - 定义宏以从一个值创建两个参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49602724/

    10-11 16:04
    查看更多