конструкторы, инициализации
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.17 10:25
Оценка:
привет!

есть некоторый препроцессорный код, генерящий структуры со всякими специфическими "потрохами".
этот макрос не генерит дефолтный конструктор, из-за чего мы вкорень устали от неинициализированных мемберов.
ну, подумал я, ща быринько поправлю макрос, чтоб генерит дефолтный конструктор....делов-то!
вот только пользователи этого макроса, уже сами начали вписывать и конструкторы, и всякий остальной код, который вставляется в тело структуры.
типа того:
#define DECLARE_TYPE(name, seq, ...) \
struct name { \
   __VA_ARGS__ \
   \
   /* тут генерятся мемберы-данные */ \
};

DECLARE_TYPE(
   type0
   ,
   (int, m0)
   (char, v1)
   ,
   type0()
      :m0{-1}
      ,m1{'0'}
   {}
   bool equal(const type0 &r) {...}
)

т.е. просто генерить дефолтный конструктор я не могу, коллизии же %)

вопрос в том, как разрулить, не рефакая пять проектов, использующих этот макрос?


спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: конструкторы, инициализации
От: night beast СССР  
Дата: 02.03.17 10:31
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>
X>DECLARE_TYPE(
X>   type0
X>   ,
X>   (int, m0, -1) //инициализацию вставляем в декларацию переменной
X>   (char, v1, 0) 
X>   ,
X>   type0()
X>      :m0{-1}
X>      ,m1{'0'}
X>   {}
X>   bool equal(const type0 &r) {...}
X>)
X>

X>т.е. просто генерить дефолтный конструктор я не могу, коллизии же %)

X>вопрос в том, как разрулить, не рефакая пять проектов, использующих этот макрос?
Re[2]: конструкторы, инициализации
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.17 10:33
Оценка:
Здравствуйте, night beast, Вы писали:
> (int, m0, -1) //инициализацию вставляем в декларацию переменной

да, вариант... спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: конструкторы, инициализации
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.17 10:35
Оценка:
Здравствуйте, niXman, Вы писали:

X>да, вариант... спасибо.

хотя нет, не вариант, ибо все равно придется рефакать все проекты...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: конструкторы, инициализации
От: night beast СССР  
Дата: 02.03.17 10:41
Оценка: 9 (1) +1
Здравствуйте, niXman, Вы писали:

X>>да, вариант... спасибо.

X>хотя нет, не вариант, ибо все равно придется рефакать все проекты...

перегрузка по количеству параметров.
если 2, то вставляем {}
как решать если у типа нет конструктора по умолчанию не знаю
Re: конструкторы, инициализации
От: _hum_ Беларусь  
Дата: 02.03.17 10:42
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>есть некоторый препроцессорный код, генерящий структуры со всякими специфическими "потрохами".

X>этот макрос не генерит дефолтный конструктор, из-за чего мы вкорень устали от неинициализированных мемберов.

не вдавался в детали, но ведь в с++11 появилась возможность дефолтной инициализации членов классов (без использования конструктора)
Re: конструкторы, инициализации
От: Кодт Россия  
Дата: 02.03.17 11:47
Оценка: 3 (2) +1
Здравствуйте, niXman, Вы писали:

X>вот только пользователи этого макроса, уже сами начали вписывать и конструкторы, и всякий остальной код, который вставляется в тело структуры.

X>т.е. просто генерить дефолтный конструктор я не могу, коллизии же %)
X>вопрос в том, как разрулить, не рефакая пять проектов, использующих этот макрос?

Если пользователи начали вписывать от безысходности — административно пресечь это безобразие.
Да, кровавый рефакторинг, зато после вылизывания кода пять проектов будут блестеть, как то, что должно блестеть после вылизывания.

Если это так и задумано, — то есть, пользователи могут создавать дефолтный конструктор, который делает что-то полезное, — тогда остаётся прямая инициализация членов.

Кстати, немножко препроцессорной магии

Как сделать перегрузку макроса по арности:
// MEMBER(type,name)       --> MEMBER2(type,name)
// MEMBER(type,name,value) --> MEMBER3(type,name,value)
#define MEMBER(type,name,...) MEMBER_DISPATCH(type,name,__VA_ARGS__, GUARD, GUARD, GUARD, MEMBER3, MEMBER2_3)
#define MEMBER_DISPATCH(type,name,optvalue,xz,xz,macro,...) macro(type,name,optvalue)
#define MEMBER2_3(type,name,guard) MEMBER2(type,name)

Как сделать подстановку дефолтных параметров
// MEMBER(type,name)       --> MEMBER3(type,name,{})
// MEMBER(type,name,value) --> MEMBER3(type,name,value)
#define MEMBER(type,name,...) MEMBER3_OPT(type,name,__VA_ARGS__,{})
#define MEMBER3_OPT(type,name,optvalue,...) MEMBER3(type,name,optvalue)
Перекуём баги на фичи!
Re[5]: конструкторы, инициализации
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.17 14:34
Оценка:
Здравствуйте, night beast, Вы писали:

NB>перегрузка по количеству параметров.

NB>если 2, то вставляем {}
так и сделал.

NB>как решать если у типа нет конструктора по умолчанию не знаю

никак не решать. просто отрефакал все использования этого макроса. все прошло успешно =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.