我有这个定义:
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/