Как мне подсчитать количество макро аргументов, переданных в вариационный макрос?

Я уже большую часть пути туда

#include <boost/preprocessor.hpp>
#define COUNT(...) BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)
COUNT(1,2,3)
COUNT(1,2)
COUNT(1)
COUNT()

Запуск этого с -E флаг в GCC выводит следующее

3 2 1 1

Когда то, что мне нужно, это:

3 2 1 0

Что я здесь не так делаю? Я не настроен на использование boost preprocessor, но мне нужно, чтобы решение было вариативным.

Есть идеи, как заставить это работать?

8

Решение

С COUNT()У вас есть один пустой аргумент.

Вы можете использовать что-то вроде:

#define PP_IS_EMPTY(...) (#__VA_ARGS__[0] == '\0' ? 1 : 0)
#define PP_COUNT(...) ((!PP_IS_EMPTY(__VA_ARGS__)) * (BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)))

В качестве альтернативы, вариационный шаблон может быть решением.

template <typename ... Ts>
constexpr std::size_t Count(Ts&&...) { return sizeof...(Ts); }
6

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector