Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
ct0r
Игогошка!
1795 / 701 / 44
Регистрация: 19.08.2012
Сообщений: 1,355
Завершенные тесты: 1
1

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

07.11.2013, 18:14. Просмотров 969. Ответов 4
Метки нет (Все метки)

И снова здравствуйте!

Решил побаловаться с бустовским препроцессором. Допустим, я хочу уметь развертывать что-то типа такого:
C++
1
2
3
4
CTOR_SERIALIZE(oa, (pa1, pc1, pa1));
// oa << boost::serialization::make_nvp("pa1",pa1) << boost::serialization::make_nvp("pc1", pc1) << boost::serialization::make_nvp("pa1", pa1);
CTOR_DESERIALIZE(ia, (("pc1", pnewc1), ("pa1", pnewa1)));
// ia >> boost::serialization::make_nvp("pc1", pnewc1) >> boost::serialization::make_nvp("pa1", pnewa1);
Само собой, все должно работать на большинстве компиляторов, а еще лучше на всех (то есть вариадики не юзаем).
Я написал свое решение, но мне оно кажется громоздким, может кто-то придумает другие, более элегантные способы?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#define CTOR_apply(r, prefix, arg) BOOST_PP_CAT(prefix, arg)
 
#define CTOR_serialize(ar, op, nvp, args) \
    BOOST_PP_CAT( \
        ar \
        , BOOST_PP_SEQ_FOR_EACH( \
             CTOR_apply \
             , BOOST_PP_CAT(op, nvp) \
             , BOOST_PP_TUPLE_TO_SEQ(BOOST_PP_TUPLE_SIZE(args), args) \
        ) \
    )
 
#define CTOR_transform(s, data, elem) \
    (BOOST_PP_CAT( \
        BOOST_PP_STRINGIZE(elem) \
        , BOOST_PP_CAT( \
            BOOST_PP_COMMA() \
            , elem \
        ) \
    ))
 
#define CTOR_SERIALIZE(ar, args) \
    CTOR_serialize(ar, <<, boost::serialization::make_nvp, \
    BOOST_PP_SEQ_TO_TUPLE( \
        BOOST_PP_SEQ_TRANSFORM \
        ( \
        CTOR_transform \
        , ~ \
        , BOOST_PP_TUPLE_TO_SEQ(BOOST_PP_TUPLE_SIZE(args), args) \
        ) \
    ))
 
#define CTOR_SERIALIZE2(ar, args) \
    CTOR_serialize(ar, >>, boost::serialization::make_nvp, args)
 
#define CTOR_DESERIALIZE(ar, args) \
    CTOR_serialize(ar, >>, boost::serialization::make_nvp, args)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2013, 18:14
Ответы с готовыми решениями:

Уменьшить количество текста
Доброго времени суток. Собственно в чем смысл программы: она берет из текстового поля слово и...

Уменьшить количество сравнений
Народ, я ток начал заниматься этим языком, так что прошу извинить, если туплю) В общем есть код...

Уменьшить количество потоков
Привет всем. Нужно уменьшить количество потоков до 2. Закрепил link на проект ниже, (в проекте...

Уменьшить количество кадров в видео
Доброго времени суток.Есть вопрос. Для более быстрого анализа видео приходиться изменять...

Как уменьшить количество запросов к БД
Здравствуйте, у меня есть цикл который выводит картинки, а alt='' и title='' должны будут...

4
Dennis Ritchie
548 / 140 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
28.04.2015, 20:02 2
Цитата Сообщение от ct0r Посмотреть сообщение
Решил побаловаться с бустовским препроцессором. Допустим, я хочу уметь развертывать что-то типа такого:
Миксины в D решают эту проблему на раз.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
27031 / 18075 / 7147
Регистрация: 22.10.2011
Сообщений: 31,825
Записей в блоге: 6
28.04.2015, 20:04 3
Вот когда этот вопрос будет задан в ветке D - это будет по теме. А сейчас это оффтоп. Предупреждать больше не буду. Продолжаешь пиар никому не нужного D в чужих ветках - получаешь карты.
2
Dennis Ritchie
548 / 140 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
28.04.2015, 20:24 4
Цитата Сообщение от volvo Посмотреть сообщение
Продолжаешь пиар никому не нужного D в чужих ветках - получаешь карты.
Да, нет тут никакого пиара. Я просто хочу сказать, что код, который представил топикстартер просто неприемлем в промышленном программировании. Препроцессор boost'а приводит к ужасным ошибкам, которые невозможно отловить в больших проектах (доказано уже не раз). Даже такие гуру-программирования на C++, как Андрей Александреску, отмечают этот факт:
Цитата Сообщение от Andrei Alexandrescu
Boost's preprocessor library is a scar on the landscape of C++. It has
wrecked such disasters on compilation times at work, that we're
considering disallowing it with a lint rule.
Я думаю, что вы просто недостаточно владеете библиотекой boost, если одобряете код топикстартера. Я считаю, что каждый пользователь boost должен знать о потенциальных ошибках и проблемах, которые могут привести к краху всего проекта, в котором использован препроцессор boost.
0
ct0r
Игогошка!
1795 / 701 / 44
Регистрация: 19.08.2012
Сообщений: 1,355
Завершенные тесты: 1
28.04.2015, 22:05  [ТС] 5
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я просто хочу сказать, что код, который представил топикстартер просто неприемлем в промышленном программировании.
Ты вообще читаешь что-нибудь? Где я писал про продакшен, тыкни пальцем. Я писал про побаловаться.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Миксины в D решают эту проблему на раз.
С++ тоже сейчас решает легко. И без буста.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я думаю, что вы просто недостаточно владеете библиотекой boost, если одобряете код топикстартера.
А ты хорошо владеешь? Сможешь объяснить каждую строчку: что, как и зачем? Может и отрефакторишь? Жду.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я считаю, что каждый пользователь boost должен знать о потенциальных ошибках и проблемах, которые могут привести к краху всего проекта, в котором использован препроцессор boost.
Расскажи, какие именно потенциальные ошибки и проблемы. Без общих слов, конкретно.
0
28.04.2015, 22:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2015, 22:05

Уменьшить количество цветов картинки!
Добрые люди, как можно решить задачу! во всем интернете только одна страница с трезвым ответом,...

Как уменьшить количество кода?
Здравствуйте. Имеется костыль код. Этот код делает типа &quot;сколько чисел вместится в одно большое...

Уменьшить количество элементов массива
Добрый вечер. Задание следующее: Реализовал следующим образом: (на функцию не обращайте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru