c++ - 是否可以对每个参数进行可变参数宏替换?

标签 c++ c++11 c-preprocessor variadic-macros

我现在在 SO 上阅读了很多关于可变参数宏的问题,但似乎没有人回答过最简单的问题:

#define IDENTITY(x) x
#define IDENTITY_FOR_ALL(...) ???

有没有办法让所有参数的 IDENTITY_FOR_ALL 扩展为 IDENTITY(X)?是否也可以使用任意数量的参数?

最佳答案

可变参数宏没有像可变参数模板那样的包扩展。

不过您可以使用 Boost.Preprocessor(或其方法)。

如果您不想在元素之间使用任何逗号,请使用

#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>

#define ID_OP(_, func, elem) func(elem)
#define APPLY_TO_ALL(func, ...)                \
    BOOST_PP_SEQ_FOR_EACH(                     \
        ID_OP, func,                           \
        BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)  \
    )

// example call:

#define SomeTransformation(x) #x // stringize the argument

APPLY_TO_ALL(SomeTransformation, 1, 2, 3) // expands to "1" "2" "3"

Demo . 带逗号:

#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/transform.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>

#define ID_OP(_, func, elem) func(elem)
#define APPLY_TO_ALL(func, ...)               \
    BOOST_PP_SEQ_ENUM(                        \
    BOOST_PP_SEQ_TRANSFORM(                   \
        ID_OP, func,                          \
        BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
    ))

// example call:

APPLY_TO_ALL(SomeTransformation, 1, 2, 3) // expands to "1", "2", "3"

Demo . 使用 g++ -std=c++11 -E -P file 检查预处理器输出。

关于c++ - 是否可以对每个参数进行可变参数宏替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474896/

相关文章:

c++ - 从基类访问 union 的公共(public)部分

c++ - move 语义以避免创建临时对象

c - #定义相关查询

c++ - 按名称调用/按值调用

c++ - Try Catch block 创建一个对象

c++ - 当给定相同的字符串输入时, `std::atof` 是否保证产生相同的输出?

c++ - 如何遍历字符串并知道索引(当前位置)?

C++ 函数在调用时崩溃(类构造函数)

c++ - 不明确的模板实例化

c - 有没有办法提供一个宏函数来返回不同类型的值,包括什么都没有?