Почему один и тот же код, созданный с помощью макросов, а другой написанный вручную, дает разные результаты в MSVC?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему один и тот же код, созданный с помощью макросов, а другой написанный вручную, дает разные результаты в MSVC?

Сообщение Anonymous »

Один и тот же код, сгенерированный макросом, а другой написанный от руки, дает разные результаты. Я запутался и не знаю, как это исправить.
Моя среда следующая:

vs2019, msvc2019_64, c++14
  • при использовании макросов:
M(code,country)

выдаст ошибку:

Недопустимая ссылка на нестатический элемент "Addr::country"
  • но если использовать рукописный текст:
он ​​будет успешным;
#define ARGS_FOREACH_1(f,_1) f(_1)
#define ARGS_FOREACH_2(f,_1,_2) f(_1) f(_2)
#define ARGS_FOREACH_3(f,_1,_2,_3) f(_1) f(_2) f(_3)
#define ARGS_FOREACH_4(f,_1,_2,_3,_4) f(_1) f(_2) f(_3) f(_4)
#define ARGS_FOREACH_5(f,_1,_2,_3,_4,_5) f(_1) f(_2) f(_3) f(_4) f(_5)
#define ARGS_FOREACH_6(f,_1,_2,_3,_4,_5,_6) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6)
#define ARGS_FOREACH_7(f,_1,_2,_3,_4,_5,_6,_7) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7)
#define ARGS_FOREACH_8(f,_1,_2,_3,_4,_5,_6,_7,_8) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8)
#define ARGS_FOREACH_9(f,_1,_2,_3,_4,_5,_6,_7,_8,_9) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9)
#define ARGS_FOREACH_10(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10)

#define ARGS_COUNT_IMPL(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,N,...) N
#define ARGS_RETURN_COUNT(...) ARGS_COUNT_IMPL(,##__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)

#define CAT_MACRO_IMPL(x,y) x##y
#define CAT_MACRO_EXPAND(x,y) CAT_MACRO_IMPL(x,y)

#define ARGS_FOREACH(f,...) CAT_MACRO_EXPAND(ARGS_FOREACH_,ARGS_RETURN_COUNT(__VA_ARGS__))(f,__VA_ARGS__)

#define M_BEGIN() \
template \
static constexpr void for_each_members_struct(Func&& func){

#define M_BODY_MEMBER(name) \
func(#name,&T::name);

#define M_END() \
}

/*
* Mandatory
* optional
*/
#define M(...) \
M_BEGIN() \
ARGS_FOREACH(M_BODY_MEMBER,__VA_ARGS__) \
M_END()

struct Addr
{
int country;
int code;
/* error */
M(code,country)

/* pass*/
/*
template
static constexpr void for_each_members_struct(Func&& func){
func("code",&T::code);
func("country",&T::country);
}
*/
};

int main()
{
Addr d;
Addr::for_each_members_struct([&](const char* name, auto v)
{
d.*v = 1;
});
std::cout

Подробнее здесь: https://stackoverflow.com/questions/798 ... tten-produ
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»