Вопрос

Я пытаюсь сделать какой-то макрос «перегрузка», так что макрос (что-то), расширяется по-разному, чем макрос (что-то, еще).

Использование фрагмента, которую я получил от здесь (Я не уверен, это 100% портативным) и некоторые функции из библиотеки PP Boost PP, я смог сделать его работать: D

//THESE TWO COUNT THE NUMBER OF ARGUMENTS
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)

//THIS ONE RETURNS THE PARAMETER AT POSITION _i FROM A LIST OF __VA_ARGS__
#define VA_ARG(_i, ...) BOOST_PP_ARRAY_ELEM(_i, (VA_NARGS(__VA_ARGS__), (__VA_ARGS__)))

//AND THIS ONE IS THE 'OVERLOADED' MACRO ;)
#define TEST(...) BOOST_PP_IF(BOOST_PP_EQUAL(1, VA_NARGS(__VA_ARGS__)), function_A(VA_ARG(0, __VA_ARGS__)), \ //1 parameter
                  BOOST_PP_IF(BOOST_PP_EQUAL(2, VA_NARGS(__VA_ARGS__)), function_B(VA_ARG(0, __VA_ARGS__) + VA_ARG(1, __VA_ARGS__)), \ //2 parameters
                  BOOST_PP_IF(BOOST_PP_EQUAL(3, VA_NARGS(__VA_ARGS__)), function_C(VA_ARG(1, __VA_ARGS__) + VA_ARG(2, __VA_ARGS__)), BOOST_PP_EMPTY())) // 3 parameters and so on ...

So       TEST(a) = function_A(a)
      TEST(a, b) = function_B(a + b)
   TEST(a, b, c) = function_C(b + c)

Теперь я все еще пропускаю две другие вещи, которые я хочу сделать:

  1. (Этого мне не волнует, если я никогда не решу ее), я считаю, что макрос может быть написан, что при наличии количества «вариантов» и его корреспондент «вывод» генерирует код, похожий на то, как указано выше. Что-то вроде шаблона (3, function_a (...), function_b (...), function_c (...)) для генерации приведенного выше примера.

  2. Что происходит, когда тест () называется без аргументов? Ну, va_nargs расширяется до 1. Но первый аргумент - «(ничего). Я пытаюсь найти способ обнаружить «нулевые» аргументы в __VA_ARGS__ Или дифференцировать между «нулевым» аргументом и реальным, чтобы расширить функцию «перегрузки» для реагирования на эту ситуацию. Есть идеи?

Это было полезно?

Решение

Чтобы ответить на ваш вопрос 2 первым. Да, с вариационными макросами также можно обнаружить пустой список аргументов. Объяснение немного длинно, я написал это здесь. Отказ Это должно быть относительно легко совмещать этот подход с помощью MACROS BOOST, которые вы используете.

За ваш вопрос 1, да, это также возможно. У A Boost есть некоторые макросы итератора, которые приближаются к этому, я думаю, но они выглядят немного страшно использовать. Если я правильно понимаю, вы должны использовать что-то вроде вложенные списки (a, (b, (c,d))), не слишком удобно.

(Я написал набор макросов, которые могут достичь этого более напрямую, но, к сожалению, пакет еще не готов к выпуску. Свяжитесь со мной наедине, если вы В самом деле заинтересован в этом.)

Редактировать: То P99. Пакет опубликован в среднее время и содержит много вещей над макросом «перегрузки» и введите универсальные макросы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top