在我能够使用this成功减少代码重复后,我希望通过完全不同的问题进一步减少代码重复
#include <iostream>
#include <array>
#define A1
#define B2
#define C3
#define D4
#define E5
enum Enum {
#ifdef A1
one,
#endif
#ifdef B2
two,
#endif
#ifdef C3
three,
#endif
#ifdef D4
four,
#endif
#ifdef E5
five,
#endif
end
};
const char* map(Enum e)
{
switch(e)
{
#ifdef A1
case one : return "one";
#endif
#ifdef B2
case two: return "two";
#endif
#ifdef C3
case three : return "three";
#endif
#ifdef D4
case four: return "four";
#endif
#ifdef E5
case five: return "five";
#endif
case end: return "end";
}
}
int main()
{
std::array<const char*, Enum::end + 1> arr{{
#ifdef A1
"a",
#endif
#ifdef B2
"b",
#endif
#ifdef C3
"c",
#endif
#ifdef D4
"d",
#endif
#ifdef E5
"e",
#endif
"z"
}};
int e = 0;
for (const auto& str : arr)
{
std::cout << str << " map " << map(Enum(e)) << std::endl;
e++;
}
return 0;
}
请注意,我的代码中的函数map
并不存在,并且仅针对此示例实现。在上面的代码中,我有两个数组,它们的值用初始化列表初始化。我想解决的问题是需要两次#ifdef
和#endif
。相反,我希望有一些像
#ifdef A1
#define A1_PAIR one, "a",
#else
#define A1_PAIR
#endif
#ifdef B2
#define B2_PAIR two, "b",
#else
#define B2_PAIR
#endif
#ifdef C3
#define C3_PAIR three, "c",
#else
#define C3_PAIR
#endif
#ifdef D4
#define D4_PAIR four, "d",
#else
#define D4_PAIR
#endif
#ifdef E5
#define E5_PAIR five, "e",
#else
#define E5_PAIR
#endif
#define MACRO(index) \
A1_PAIR \
B2_PAIR \
C3_PAIR \
D4_PAIR \
E5_PAIR \
end, "z"
enum Enum{ MACRO(1) };
std::array<const char*, Enum::end 1> arr2{{ MACRO(2) }};
显然,这段代码不起作用,但我可以用这种精神写一些东西吗?
答案 0 :(得分:1)
您可以使用pair / tuple将数据分组在一起:
std::array<std::pair<const char*, const char*>, NUM + 1> arr{{
#ifdef A1
{"1", "a"},
#endif
#ifdef B2
{"2", "b"},
#endif
#ifdef C3
{"3", "c"},
#endif
#ifdef D4
{"4", "d"},
#endif
#ifdef E5
{"5", "e"},
#endif
{"26", "z"}
}};
for (const auto& p : arr) {
std::cout << p.first << std::endl;
}
for (const auto& str : arr) {
std::cout << p.second << std::endl;
}
std::cout << "ok" << std::endl;
答案 1 :(得分:0)
创建一个数组:
using arr_type=char const[];
#define ARRAY_SOURCE = arr_type{ "1", "a", "2", "b", /* etc */ }
使用#ifdef
来定义索引。
// elements.inc:
#ifdef A
ARRAY_SOURCE[0+OFFSET],
#endif
// etc
然后
std::array<const char*, NUM + 1> arr1{{
#define OFFSET 0
#include "elements.inc"
#undef OFFSET
}};
std::array<const char*, NUM + 1> arr2{{
#define OFFSET 1
#include "elements.inc"
#undef OFFSET
}};