C++ 和预处理器宏 : variadic type

标签 c++ macros variadic preprocessor-directive

以下面的宏为例:

#define _CREATE_VAR(X1) double X1{smc::define_variable (data, X1, #X1)};
#define _CREATE_VAR2(X1,X2) double X1{smc::define_variable (data, X1, #X1)}; /
                        double X2{smc::define_variable (data, X2, #X2)}; /
#define _CREATE_VAR3(X1,X2,X3) double X1{smc::define_variable (data, X1, #X1)}; /
                        double X2{smc::define_variable (data, X2, #X2)}; /
                        double X3{smc::define_variable (data, X3, #X3)}; /
#define _CREATE_VAR4(X1,X2,X3,X4) double X1{smc::define_variable (data, X1, #X1)}; /
                        double X2{smc::define_variable (data, X2, #X2)}; /
                        double X3{smc::define_variable (data, X3, #X3)}; /
                        double X4{smc::define_variable (data, X4, #X4)}; /
#define _CREATE_VAR5(X1,X2,X3,X4,X5) double X1{smc::define_variable (data, X1, #X1)}; /
                        double X2{smc::define_variable (data, X2, #X2)}; /
                        double X3{smc::define_variable (data, X3, #X3)}; /
                        double X4{smc::define_variable (data, X4, #X4)}; /
                        double X5{smc::define_variable (data, X5, #X5)}; /

有没有一种方法可以通过使用一个宏_CREATE_VAR来简化这一过程,而不是使用具有不同变量参数和相应名称的多个实例?理想情况下,我希望自动调用相同的宏_CREATE_VAR,无论有多少参数。

最佳答案

如果您不介意稍微不同的调用语法,您可以使用 boost.preprocessor为此:

#include "boost/preprocessor.hpp"

// or to not include entire preprocessor header, the following header files will do
// #include <boost/preprocessor/stringize.hpp>
// #include <boost/preprocessor/seq/for_each.hpp>

#define CREATE_ONE_VAR(maR_, maData_, maVarName) \
  double maVarName {smc::define_variable (data, maVarName, BOOST_PP_STRINGIZE(maVarName))};

#define CREATE_VAR(maSeq) \
  BOOST_PP_SEQ_FOR_EACH(CREATE_ONE_VAR, %%, maSeq)

使用示例:

CREATE_VAR((x1)(x2)(x3))  //does the same as your original _CREATE_VAR3(x1, x2, x3)

现在您可以使用从 1 到 BOOST_PP_LIMIT_SEQ 的任意数量的变量来调用它,通常为 256。

一些注意事项: 我使用 %% 来指示该参数未使用。您可以在其中放置任何内容(它会传递给内部宏的 maData 参数,我们不使用该参数)。

您不应将宏命名为以下划线开头,后跟大写字母。根据标准,这是非法的,因为此类符号(以及任何包含两个连续下划线的符号)是为编译器保留的。

关于C++ 和预处理器宏 : variadic type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15609533/

相关文章:

templates - 使用多个模板的运算符重载

scala - 无法在宏生成的类中访问方法

c - 如何将结构传递和访问 C 中的可变参数函数

macros - Racket with-hash 宏和重命名转换器

Swift 3.0 闭包表达式 : what if the variadic parameters not at the last place in the parameters list?

c++ - 具有可变参数模板的数据结构

c++ - 折叠表达式是否会短路?

c++ - condition_variable::wait_for 和 wait_until 使用 chrono::steady_clock 但在 PC sleep 时跳过持续时间?

c++ - Python NamedTuple 到 C++ 结构

scala - Scala 中的类型细化但不使用细化