@@ -95,9 +95,14 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
95
95
} // namespace detail
96
96
} // namespace wise_enum
97
97
98
+
99
+ // Needed for expansion of variadic macro arguments in MSVC
100
+ // MSVC expands __VA_ARGS__ after passing it, while gcc expands it before
101
+ #define WISE_ENUM_IMPL_EXPAND (x ) x
102
+
98
103
#define WISE_ENUM_IMPL_NARG (...) \
99
104
WISE_ENUM_IMPL_NARG_ (__VA_ARGS__, WISE_ENUM_IMPL_RSEQ_N())
100
- #define WISE_ENUM_IMPL_NARG_ (...) WISE_ENUM_IMPL_ARG_N(__VA_ARGS__)
105
+ #define WISE_ENUM_IMPL_NARG_ (...) WISE_ENUM_IMPL_EXPAND( WISE_ENUM_IMPL_ARG_N(__VA_ARGS__) )
101
106
102
107
// ARG_N and RSEQ_N defined in wise_enum_generated.h
103
108
@@ -118,7 +123,8 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
118
123
#define WISE_ENUM_IMPL_IIF_1 (t, f ) t
119
124
120
125
#define WISE_ENUM_IMPL_CHECK_N (x, n, ...) n
121
- #define WISE_ENUM_IMPL_CHECK (...) WISE_ENUM_IMPL_CHECK_N(__VA_ARGS__, 0 , )
126
+ #define WISE_ENUM_IMPL_CHECK (...) \
127
+ WISE_ENUM_IMPL_EXPAND (WISE_ENUM_IMPL_CHECK_N(__VA_ARGS__, 0 , ))
122
128
#define WISE_ENUM_IMPL_PROBE (x ) x, 1 ,
123
129
124
130
#define WISE_ENUM_IMPL_IS_PAREN (x ) \
@@ -164,9 +170,11 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
164
170
WISE_ENUM_IMPL_CAT (WISE_ENUM_IMPL_LOOP_, num_enums), \
165
171
__VA_ARGS__)
166
172
173
+
167
174
#define WISE_ENUM_IMPL_3 (type, name, storage, friendly, num_enums, loop, ...) \
168
175
type name storage{ \
169
- loop (WISE_ENUM_IMPL_ENUM_INIT, _, WISE_ENUM_IMPL_COMMA, __VA_ARGS__)}; \
176
+ WISE_ENUM_IMPL_EXPAND (loop (WISE_ENUM_IMPL_ENUM_INIT, _, \
177
+ WISE_ENUM_IMPL_COMMA, __VA_ARGS__))}; \
170
178
WISE_ENUM_IMPL_ADAPT_3 (name, friendly, num_enums, loop, __VA_ARGS__)
171
179
172
180
#define WISE_ENUM_IMPL_ADAPT (name, ...) \
@@ -185,16 +193,16 @@ WISE_ENUM_CONSTEXPR_14 bool compare(U u1, U u2) {
185
193
friendly constexpr std::array<::wise_enum::detail::value_and_name<name>, \
186
194
num_enums> \
187
195
wise_enum_detail_array (::wise_enum::detail::Tag<name>) { \
188
- return {{loop (WISE_ENUM_IMPL_DESC_PAIR, name, WISE_ENUM_IMPL_COMMA , \
189
- __VA_ARGS__)}}; \
196
+ return {{WISE_ENUM_IMPL_EXPAND ( loop (WISE_ENUM_IMPL_DESC_PAIR, name, \
197
+ WISE_ENUM_IMPL_COMMA, __VA_ARGS__)) }}; \
190
198
} \
191
199
\
192
200
template <class T > \
193
201
friendly WISE_ENUM_CONSTEXPR_14 ::wise_enum::string_type \
194
202
wise_enum_detail_to_string (T e, ::wise_enum::detail::Tag<name>) { \
195
203
switch (e) { \
196
- loop (WISE_ENUM_IMPL_SWITCH_CASE, name, WISE_ENUM_IMPL_NOTHING, \
197
- __VA_ARGS__) \
204
+ WISE_ENUM_IMPL_EXPAND ( loop (WISE_ENUM_IMPL_SWITCH_CASE, name, \
205
+ WISE_ENUM_IMPL_NOTHING, __VA_ARGS__)) \
198
206
} \
199
207
return {}; \
200
208
}
0 commit comments