Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deMax от Сентябрь 21, 2015, 08:53



Название: передать в define список
Отправлено: deMax от Сентябрь 21, 2015, 08:53
Собственно для сериализации в ini файл использую следущий дефайн:
#define ADDVALUE(value) add(QString(typeid(value).name()), &value, #value)

Код:
struct My: public Base {
        QString name;
        QColor  c1, c2, c3;
        My() { ADDVALUE(name); ADDVALUE(c1); ADDVALUE(c2); ADDVALUE(c3); }};

Можно ли сделать так чтобы имя переменной писать только один раз, или хотя бы ADDVALUES(name, c1, c2, c3) ?

Как сделать чтобы в режиме отладки отображались переменные класса для которых забыл добавить ADDVALUE() ?


Название: Re: передать в define список
Отправлено: Racheengel от Сентябрь 23, 2015, 11:50
а что мешает сделать макрос с листом в виде параметра?


Название: Re: передать в define список
Отправлено: deMax от Сентябрь 23, 2015, 14:45
Можно пример?


Название: Re: передать в define список
Отправлено: Racheengel от Сентябрь 23, 2015, 15:03
ну как-то типа этого

#define ADDVALUES(list) foreach(const QString& s, list) ADDVALUE(s);

где list - это QStringList.

Для отладки qDebug() тогда можно юзать, типа qDebug() << list


Название: Re: передать в define список
Отправлено: Igors от Сентябрь 24, 2015, 10:23
Код
C++ (Qt)
#define ADD2VALUES(a, b)  ADDVALUE(a); ADDVALUE(b)
#define ADD3VALUES(a, b, c)  ADD2VALUES(a, b); ADDVALUE(c)

Ход мысли понятен: вот задействую # в макросе - и все имена пулеметом/автоматом! Обычно в конце-концов выясняется что возня с такой "системой рычагов" себя не оправдывает, проще было разориться на ту несчастную строку


Название: Re: передать в define список
Отправлено: Johnik от Сентябрь 25, 2015, 00:16
можно использовать макросы с переменным числом параметров и boost.preprocessor

Пример (для упрощения взял Map):
Код
C++ (Qt)
#include <QMap>
 
#include <boost/preprocessor.hpp>
 
#define ADDVALUE(v) \
vs.insert(BOOST_PP_STRINGIZE(v), v)
 
#define ADDVALUES_item(r, data, elem) \
ADDVALUE(elem);
 
#define ADDVALUES(...) \
BOOST_PP_SEQ_FOR_EACH(ADDVALUES_item, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
 
int main(int argc, char *argv[])
{
QMap<QString, int> vs;
ADDVALUES(1,2,3);
ADDVALUES(5,4);
ADDVALUES(6);
}
 

PS. предвижу закидывание тапками "любителями" boost'а


Название: Re: передать в define список
Отправлено: Racheengel от Сентябрь 25, 2015, 10:14
Вообще, макросы - неблагодарное дело, лучше static функции использовать.


Название: Re: передать в define список
Отправлено: deMax от Сентябрь 30, 2015, 20:09
и как узнать имя переменной без макроса, да еще в статичной функции?
например загнать int a,b,c,d; в QMap map; map["a"]=&a; ....


Название: Re: передать в define список
Отправлено: Igors от Октябрь 01, 2015, 05:08
и как узнать имя переменной без макроса, да еще в статичной функции?
например загнать int a,b,c,d; в QMap map; map["a"]=&a; ....
Так и писать (map["a"]=&a;). Да, и так для всех, хоть их сотни. Но это делается один раз, и Вы можете иметь любые текстовые имена.