【发布时间】:2021-09-16 19:00:04
【问题描述】:
我编写了一些实用宏来将enum 值转换为std::string:
#include <map>
#include <string>
#define MY_map_entry_(name, value) {#value, name::value}
#define MY_map_2(name, v1, v2) MY_map_entry_(name, v1), MY_map_entry_(name, v2)
#define MY_map_3(name, v1, v2, v3) MY_map_entry_(name, v1), MY_map_2(name, v2, v3)
这完全按预期工作:
enum class rgb { red, green, blue };
static const std::map<std::string, rgb> string_to_rgb{ MY_map_3(rgb, red, green, blue) };
// { {"red", rgb::red}, {"green", rgb::green}, {"blue", rgb::blue} }
但是,编写宏开始变得有些乏味;所以我想我会尝试__VA_ARGS__
#define MY_map_4(name, v1, ...) MY_map_entry_(name, v1), MY_map_3(name, __VA_ARGS__)
有一个用例
enum class cymk { cyan, yellow, magenta, black };
static const std::map<std::string, cymk> string_to_cymk{ MY_map_4(cymk, cyan, yellow, magenta, black) };
这不起作用,没有__VA_ARGS__ 的类似宏可以
#define MY_map_4(name, v1, v2, v3, v4) MY_map_entry_(name, v1), MY_map_3(name, v2, v3, v4)
有没有办法用__VA_ARGS__写MY_map_4?
(当然,如果不使用 any 宏,这样做会很好——或者至少可以接近——但我认为这是不可能的。)
【问题讨论】:
标签: c++ c-preprocessor