Russian Qt Forum
Май 09, 2024, 23:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: передать в define список  (Прочитано 4205 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Сентябрь 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() ?
« Последнее редактирование: Сентябрь 21, 2015, 08:55 от deMax » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Сентябрь 23, 2015, 11:50 »

а что мешает сделать макрос с листом в виде параметра?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Сентябрь 23, 2015, 14:45 »

Можно пример?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Сентябрь 23, 2015, 15:03 »

ну как-то типа этого

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

где list - это QStringList.

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 24, 2015, 10:23 »

Код
C++ (Qt)
#define ADD2VALUES(a, b)  ADDVALUE(a); ADDVALUE(b)
#define ADD3VALUES(a, b, c)  ADD2VALUES(a, b); ADDVALUE(c)

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

Сообщений: 339


Просмотр профиля
« Ответ #5 : Сентябрь 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'а
« Последнее редактирование: Сентябрь 25, 2015, 00:18 от Johnik » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Сентябрь 25, 2015, 10:14 »

Вообще, макросы - неблагодарное дело, лучше static функции использовать.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Сентябрь 30, 2015, 20:09 »

и как узнать имя переменной без макроса, да еще в статичной функции?
например загнать int a,b,c,d; в QMap map; map["a"]=&a; ....
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 01, 2015, 05:08 »

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


Страница сгенерирована за 0.086 секунд. Запросов: 23.