Что можно сделать лучше, ну например расширить сиквенс (void)(foo) до (void)(foo)(A)(a)
что бы можно было задавать имена параметров шаблона и аргументов функций.
Ну или много чего другого
з.ы.
boost — кульная либа.
Re: Как быть, если аргументы BOOST_PP_IF - макросы?
Здравствуйте, enji, Вы писали:
E>Хочется сгенерить такое: E>... E>Можно ли как-то извернуться с IF?
Я когда-то расширитель написал, можно посмотреть здесь
#define PRINT(Z, N, DATA) \
BOOST_PP_IF(N, template <BOOST_PP_ENUM_PARAMS_Z(Z, N, class A)>, BOOST_PP_EMPTY()) \
void f(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, a));
BOOST_PP_REPEAT(5, PRINT, ~)
но не работает. Если убрать IF и void f() без параметров прописать руками, то все нормально:
void f();
#define PRINT(Z, N, DATA) \
template <BOOST_PP_ENUM_PARAMS_Z(Z, N, class A)> \
void f(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, a));
BOOST_PP_REPEAT(5, PRINT, ~)
Можно ли как-то извернуться с IF?
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re: Как быть, если аргументы BOOST_PP_IF - макросы?
Сейчас к сожалению времени нет, но если к обеду не получиться у Вас — подключусь помогу. На самом деле там ничего сложного.
Главное всегда помнить что препроцессор однопроходный.
Re[2]: Как быть, если аргументы BOOST_PP_IF - макросы?
Здравствуйте, nen777w, Вы писали:
N>Может быть попробовать сделать через:
N>BOOST_PP_SEQ_FILTER + BOOST_PP_GREATER
N>Сейчас к сожалению времени нет, но если к обеду не получиться у Вас — подключусь помогу. На самом деле там ничего сложного. N>Главное всегда помнить что препроцессор однопроходный.
Так не работает...
#define PRED(s, data, elem) BOOST_PP_GREATER(data, 0)
#define PRINT(Z, N, DATA) \
BOOST_PP_SEQ_FILTER(PRED, N, (template <BOOST_PP_ENUM_PARAMS_Z(Z, N, class A)>) ) \
void f()(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, &a)) const;
BOOST_PP_REPEAT(5, PRINT, ~)
Да и BOOST_PP_SEQ_FILTER вернет последовательность, т.е. (template ...), а как скобки убрать? SEQ_ELEM?
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[4]: Как быть, если аргументы BOOST_PP_IF - макросы?
Здравствуйте, nen777w, Вы писали:
V>>С моим расширением — короче: V>> N>Гм... да на много. Может вам того... это предложить в boost ?
Там перед тем как предлогать надо тестировать под кучей компиляторов, а это надо как минимум всех их ставить и настраивать boost.build. Вообщем на всё это нужно много времени, которого пока что не хватает.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: Как быть, если аргументы BOOST_PP_IF - макросы?
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, nen777w, Вы писали:
V>>>С моим расширением — короче: V>>> N>>Гм... да на много. Может вам того... это предложить в boost ? V>Там перед тем как предлогать надо тестировать под кучей компиляторов, а это надо как минимум всех их ставить и настраивать boost.build. Вообщем на всё это нужно много времени, которого пока что не хватает.
Вы хотя бы добавьте в Trac.
А там будет время приложите патч.
Здравствуйте, _nn_, Вы писали:
V>>>>С моим расширением — короче: V>>>> N>>>Гм... да на много. Может вам того... это предложить в boost ? V>>Там перед тем как предлогать надо тестировать под кучей компиляторов, а это надо как минимум всех их ставить и настраивать boost.build. Вообщем на всё это нужно много времени, которого пока что не хватает. __>Вы хотя бы добавьте в Trac. __>А там будет время приложите патч.
А надо ли? Я к тому что этот аддон мало кому реально нужен, а если нужен, то можно найти на RSDN'е
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: Как быть, если аргументы BOOST_PP_IF - макросы?
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, _nn_, Вы писали:
V>>>>>С моим расширением — короче: V>>>>> N>>>>Гм... да на много. Может вам того... это предложить в boost ? V>>>Там перед тем как предлогать надо тестировать под кучей компиляторов, а это надо как минимум всех их ставить и настраивать boost.build. Вообщем на всё это нужно много времени, которого пока что не хватает. __>>Вы хотя бы добавьте в Trac. __>>А там будет время приложите патч. V>А надо ли? Я к тому что этот аддон мало кому реально нужен, а если нужен, то можно найти на RSDN'е
Если кому-то будет очень нужен, так еще и в буст добавят
Пусть тикет висит, когда-нибудь может пригодится.
Здравствуйте, _nn_, Вы писали:
V>>>>>>С моим расширением — короче: V>>>>>> N>>>>>Гм... да на много. Может вам того... это предложить в boost ? V>>>>Там перед тем как предлогать надо тестировать под кучей компиляторов, а это надо как минимум всех их ставить и настраивать boost.build. Вообщем на всё это нужно много времени, которого пока что не хватает. __>>>Вы хотя бы добавьте в Trac. __>>>А там будет время приложите патч. V>>А надо ли? Я к тому что этот аддон мало кому реально нужен, а если нужен, то можно найти на RSDN'е __>Если кому-то будет очень нужен, так еще и в буст добавят __>Пусть тикет висит, когда-нибудь может пригодится.
Тут есть несколько но: Есть версия в которой много чего ещё добавлено, но пока-что недотестировано.
Некоторые исходники генерятся по шаблону, т.е. есть для этого скрипт в виде bat-файл+exe-файл, непонятно пока как это переправить в буст. Хотелось бы выложить не только сгенерённые исходники, но и скрипты их генерирующие, непонятно что со скриптами делать, под какой шелл переписывать?
Есть тесты для некоторой добавленной функциональности, куда их пихать и в каком виде?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: Как быть, если аргументы BOOST_PP_IF - макросы?
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, _nn_, Вы писали:
V>>>>>>>С моим расширением — короче: V>>>>>>> N>>>>>>Гм... да на много. Может вам того... это предложить в boost ? V>>>>>Там перед тем как предлогать надо тестировать под кучей компиляторов, а это надо как минимум всех их ставить и настраивать boost.build. Вообщем на всё это нужно много времени, которого пока что не хватает. __>>>>Вы хотя бы добавьте в Trac. __>>>>А там будет время приложите патч. V>>>А надо ли? Я к тому что этот аддон мало кому реально нужен, а если нужен, то можно найти на RSDN'е __>>Если кому-то будет очень нужен, так еще и в буст добавят __>>Пусть тикет висит, когда-нибудь может пригодится. V>Тут есть несколько но: V>Есть версия в которой много чего ещё добавлено, но пока-что недотестировано.
Тогда сюда , мы потестируем
V>Некоторые исходники генерятся по шаблону, т.е. есть для этого скрипт в виде bat-файл+exe-файл, непонятно пока как это переправить в буст. Хотелось бы выложить не только сгенерённые исходники, но и скрипты их генерирующие, непонятно что со скриптами делать, под какой шелл переписывать?
V>Есть тесты для некоторой добавленной функциональности, куда их пихать и в каком виде?
Тесты в виде Boost.Test .
А можно заранее оформить структуру папок в стиле boost-а.
E>#define PRINT(Z, N, DATA) \
E> BOOST_PP_IF(N, template <BOOST_PP_ENUM_PARAMS_Z(Z, N, class A)>, BOOST_PP_EMPTY()) \
E> void f(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, a));
E>но не работает. Если убрать IF и void f() без параметров прописать руками, то все нормально:
Я бы так и сделал, оно проще
E>Можно ли как-то извернуться с IF?
Можно:
#define PRINT(Z, N, DATA) \
BOOST_PP_EXPAND(BOOST_PP_IF(N, BOOST_PP_TUPLE_REM(N), BOOST_PP_EMPTY)\
BOOST_PP_IF(N, (template <BOOST_PP_ENUM_PARAMS_Z (Z, N, class A) >), ())) \
void f(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, a));
Идея в том, чтобы экранировать получающиеся в результате раскрытия BOOST_PP_ENUM_PARAMS запятые.
В данном случае я их упаковываю в TUPLE (добавляя скобки вокруг), который потом очищаю от скобок применением BOOST_PP_TUPLE_REM.
Вариант с одним BOOST_PP_IF и дополнительной макрой, генерящей template<...>:
#define TPL(Z,N,text) template<BOOST_PP_ENUM_PARAMS_Z (Z, N, text)>
#define PRINT(Z, N, DATA) \
BOOST_PP_IF(N, TPL, BOOST_PP_TUPLE_EAT(3))(Z,N,class A) \
void f(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, a));
Достоинство этого метода в его скорости — раскрываться будет только то, что нужно, а не все сразу и потом делаться выбор из всего раскрытого.
В данном случае большой рояли не играет, но в случае условного раскрытия более тяжелых макросов это — самый правильный путь.
Вариант с вариадиками:
#define TPL(...) template< __VA_ARGS__ >
#define TUPLE_EAT(...)
#define PRINT(Z, N, DATA) \
BOOST_PP_IF( N, TPL, TUPLE_EAT )( BOOST_PP_ENUM_PARAMS_Z(Z, N, class A) ) \
void f(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, a));
Еще вариант с ними же, более обобщенный и ближе к оригинальному примеру (используется вариадик TUPLE_REM вместо BOOST_PP_TUPLE_REM(N) — естественное и удобное расширение, так же как и TUPLE_EAT вместо BOOST_PP_TUPLE_EAT(N)):
#define TUPLE_REM(...) __VA_ARGS__
#define PRINT(Z, N, DATA) \
BOOST_PP_IF( N, TUPLE_REM, BOOST_PP_TUPLE_EAT(1) ) \
(template < BOOST_PP_ENUM_PARAMS_Z (Z, N, class A) >) \
void f(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, a));
BOOST_PP_TUPLE_EAT(1) можно заменить на вариадик TUPLE_EAT из предыдущего примера (и наоборот, в этом конкретном случае).
В обоих подходах используется подход функционального программирования — BOOST_PP_IF возвращает функцию, которая потом применяется к списку аргументов, вместо того, чтоб работать сразу с примененными аргументами.