вопрос по boost.preprocessor и boost_pp_tuple_size()
От: niXman Ниоткуда https://github.com/niXman
Дата: 16.08.13 07:03
Оценка:
приветствую!

в некотором коде, есть подозрение на то, что BOOST_PP_TUPLE_SIZE() возвращает 1 даже если тьюпл не содержит элементов.
пытаюсь таким вот способом проверить:
#include <boost/preprocessor/tuple/size.hpp>

#define tuple0 ()
#define tuple1 (1)
#define tuple2 (1,2)

[0:BOOST_PP_TUPLE_SIZE(tuple0)]
[1:BOOST_PP_TUPLE_SIZE(tuple1)]
[2:BOOST_PP_TUPLE_SIZE(tuple2)]

по после препроцессирования, макросы BOOST_PP_TUPLE_SIZE() не раскрываются.
чяднт?

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: zaufi Земля  
Дата: 16.08.13 07:36
Оценка:
Здравствуйте, niXman, Вы писали:

X>приветствую!


X>в некотором коде, есть подозрение на то, что BOOST_PP_TUPLE_SIZE() возвращает 1 даже если тьюпл не содержит элементов.


именно! я тоже тут около месяца назад "наступал" ;(( -- пустых туплов по всей видимости не бывает... -- забил, изменил дизайн, в общем как-то объехал не став связываться с поиском "баги"...
Re: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: jazzer Россия Skype: enerjazzer
Дата: 16.08.13 07:43
Оценка: 1 (1)
Здравствуйте, niXman, Вы писали:

X>приветствую!


X>в некотором коде, есть подозрение на то, что BOOST_PP_TUPLE_SIZE() возвращает 1 даже если тьюпл не содержит элементов.


Потому что такого не бывает:

Valid tuple sizes range from 1 to BOOST_PP_LIMIT_TUPLE.

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: niXman Ниоткуда https://github.com/niXman
Дата: 16.08.13 08:02
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Потому что такого не бывает:

J>

J> Valid tuple sizes range from 1 to BOOST_PP_LIMIT_TUPLE.

откуда эта цитата?

скажи, а есть ли способ чтоб определить, что элемент тьюпла пуст?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: jazzer Россия Skype: enerjazzer
Дата: 16.08.13 08:38
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, jazzer, Вы писали:


J>>Потому что такого не бывает:

J>>

J>> Valid tuple sizes range from 1 to BOOST_PP_LIMIT_TUPLE.

X>откуда эта цитата?
http://www.boost.org/doc/libs/1_54_0/libs/preprocessor/doc/ref/tuple_elem.html

X>скажи, а есть ли способ чтоб определить, что элемент тьюпла пуст?

хз, никогда не было нужно, зачем тебе это?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: niXman Ниоткуда https://github.com/niXman
Дата: 16.08.13 08:41
Оценка:
Здравствуйте, jazzer, Вы писали:

J>http://www.boost.org/doc/libs/1_54_0/libs/preprocessor/doc/ref/tuple_elem.html

странно.. почему это находится не в описании BOOST_PP_TUPLE_SIZE()?...

J>зачем тебе это?

у меня есть массив тьюплов, из которых генеряться сигнатуры методов:
(int, double)

так вот, для случая когда элементов в тьюпле нет — нужно генерировать иначе.
сейчас же, у меня нет возможности определить, пустой тьюпл, или нет.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: okman Беларусь https://searchinform.ru/
Дата: 16.08.13 09:08
Оценка:
Здравствуйте, niXman, Вы писали:

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


Способ, описанный здесь, не подойдет ?

Detect empty macro arguments
http://gustedt.wordpress.com/2010/06/08/detect-empty-macro-arguments

Проверял на MSVC и GCC.
Re[6]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: niXman Ниоткуда https://github.com/niXman
Дата: 16.08.13 09:17
Оценка:
Здравствуйте, okman, Вы писали:

O>http://gustedt.wordpress.com/2010/06/08/detect-empty-macro-arguments


вот что говорят на SO:
http://stackoverflow.com/questions/18269381/boost-pp-tuple-size-and-empty-tuple

и так же привели твою ссылку. разбираюсь...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: Vain Россия google.ru
Дата: 16.08.13 20:45
Оценка:
Здравствуйте, zaufi, Вы писали:

X>>приветствую!

X>>в некотором коде, есть подозрение на то, что BOOST_PP_TUPLE_SIZE() возвращает 1 даже если тьюпл не содержит элементов.
Z>именно! я тоже тут около месяца назад "наступал" ;(( -- пустых туплов по всей видимости не бывает... -- забил, изменил дизайн, в общем как-то объехал не став связываться с поиском "баги"...
В буст макросах всё построено на слиянии имени макроса и параметров в новый макрос. Соответственно нельзя сканкатенировать чтото с пустым местом.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: niXman Ниоткуда https://github.com/niXman
Дата: 18.08.13 10:43
Оценка:
у кого-то есть идеи, как преобразовать тьюпл в список параметров?
т.е.: '(1, 2)' -> '1, 2'
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: Chorkov Россия  
Дата: 19.08.13 08:44
Оценка: 6 (1) +1
Здравствуйте, niXman, Вы писали:

X>у кого-то есть идеи, как преобразовать тьюпл в список параметров?

X>т.е.: '(1, 2)' -> '1, 2'

  #define TUPLE_TO_ARGS(...)  __VA_ARGS__


Использование:
  #define PRINT_TUPLE( TUPLE_NAME ) print( TUPLE_TO_ARGS TUPLE_NAME ); // где print - функция а не макрос ...

    PRINT_TUPLE( tuple0 ); // print();
    PRINT_TUPLE( tuple1 ); // print(1);
    PRINT_TUPLE( tuple2 ); // print(1,2);


Но, наверное, ты имел ввиду какую-то другую частную задачу ...
Re[5]: вопрос по boost.preprocessor и boost_pp_tuple_size()
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.08.13 09:06
Оценка:
да, то что нужно!

просто я пробовал так: '#define PRINT_TUPLE( TUPLE_NAME ) TUPLE_TO_ARGS(TUPLE_NAME)'
потому у меня и появлялась пара круглых скобочек %)

оставлю тут, вдруг кому сгодится.
код:

#include <boost/preprocessor.hpp>

/***************************************************************************/

#define _ARG16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, ...) _15
#define HAS_COMMA(...) _ARG16(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)
#define _TRIGGER_PARENTHESIS_(...) ,
 
#define ISEMPTY(...) \
    _ISEMPTY( \
        /* test if there is just one argument, eventually an empty one */ \
        HAS_COMMA(__VA_ARGS__), \
        /* test if _TRIGGER_PARENTHESIS_ together with the argument adds a comma */ \
        HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__),                 \
        /* test if the argument together with a parenthesis adds a comma */ \
        HAS_COMMA(__VA_ARGS__ (/*empty*/)), \
        /* test if placing it between _TRIGGER_PARENTHESIS_ and the parenthesis adds a comma */ \
        HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (/*empty*/)) \
    )
 
#define PASTE5(_0, _1, _2, _3, _4) _0 ## _1 ## _2 ## _3 ## _4
#define _ISEMPTY(_0, _1, _2, _3) HAS_COMMA(PASTE5(_IS_EMPTY_CASE_, _0, _1, _2, _3))
#define _IS_EMPTY_CASE_0001 ,

#define TUPLE_TO_ARGS(...)  __VA_ARGS__
#define PRINT_TUPLE( TUPLE_NAME ) TUPLE_TO_ARGS TUPLE_NAME

/***************************************************************************/

#define tuple0 ()
#define tuple1 (1)
#define tuple2 (1,2)
#define tuple3 (1,2,3)
#define tuple4 (1,2,3,4)
#define tuple5 (1,2,3,4,5)
#define tuple6 (1,2,3,4,5,6)
#define tuple7 (1,2,3,4,5,6,7)
#define tuple8 (1,2,3,4,5,6,7,8)
#define tuple9 (1,2,3,4,5,6,7,8,9)

/***************************************************************************/

int main() {
    0:ISEMPTY(PRINT_TUPLE(tuple0))
    1:ISEMPTY(PRINT_TUPLE(tuple1))
    2:ISEMPTY(PRINT_TUPLE(tuple2))
    3:ISEMPTY(PRINT_TUPLE(tuple3))
    4:ISEMPTY(PRINT_TUPLE(tuple4))
    5:ISEMPTY(PRINT_TUPLE(tuple5))
    6:ISEMPTY(PRINT_TUPLE(tuple6))
    7:ISEMPTY(PRINT_TUPLE(tuple7))
    8:ISEMPTY(PRINT_TUPLE(tuple8))
    9:ISEMPTY(PRINT_TUPLE(tuple9))
}

/***************************************************************************/

результат:
int main() {
 0:1
 1:0
 2:0
 3:0
 4:0
 5:0
 6:0
 7:0
 8:0
 9:0
}



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