【问题标题】:How do I count the number of macro arguments passed to a variadic macro?如何计算传递给可变参数宏的宏参数的数量?
【发布时间】:2014-10-01 15:43:42
【问题描述】:

我已经走了大部分路了:

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

在 GCC 中使用 -E 标志运行它会输出以下内容

3 2 1 1

当我需要的是:

3 2 1 0

我在这里做错了什么?我不打算使用boost preprocessor,但我确实需要可变参数的解决方案。

任何想法如何让它工作?

【问题讨论】:

  • @JoachimPileborg 我正在运行带有-E 标志的g++ 来扩展宏。它是可验证的。
  • COUNT() 正在传递一个参数;它只是空的。
  • 我没怎么用过 Boost.Preprocessor,所以这可能太复杂了,但是BOOST_PP_IF(BOOST_PP_GREATER(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 1), BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), BOOST_PP_NOT(BOOST_PP_IS_EMPTY(__VA_ARGS__))) 有用吗?

标签: c++ boost-preprocessor


【解决方案1】:

使用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); }

【讨论】:

  • 太棒了。正是我所追求的:)
猜你喜欢
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2012-07-04
  • 2011-05-24
  • 1970-01-01
  • 2013-10-04
相关资源
最近更新 更多