将动态数组元素解析为参数? (可变参数)

时间:2015-10-30 09:46:11

标签: c++ arrays parsing macros expand

试图找到一个(可能)预处理技巧,它会做类似下一个伪C ++

的事情
myVariadicFun(argv[0],argv[1],argv[2],...,argv[argc] );

可变参数函数已准备就绪,只需要解析其中的数组参数。

原因 只是传递一个数组指针是因为我实际上正在玩 constexpr / metaprogramming。 / p>

2 个答案:

答案 0 :(得分:0)

使用[Boost.Preprocessor],您可以轻松地根据屏幕截图中描述的需求实现适当的代码生成:

#include <boost/preprocessor/repetition/enum.hpp>

#define ARRAY_ELEMENTS(z, n, arrVar) arrVar[n]

#define EXPAND_ARRAY(N, arrVar) \
  BOOST_PP_ENUM(N, ARRAY_ELEMENTS, arrVar)

#define EXPAND_CASE(N, arrVar) \
    case N: cout << crawler(EXPAND_ARRAY(N, arrVar)).best_sum << endl; break

int main(int argc, char* argv[]) {
    char** input = &argv[1];
    --args;
    switch(argc) {
    EXPAND_CASE(1, input);
    EXPAND_CASE(2, input);
    EXPAND_CASE(3, input);
    }
}

BOOST_PP_REPEAT_FROM_TO允许执行进一步的代码折叠:

#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/repetition/repeat_from_to.hpp>

#define ARRAY_ELEMENTS(z, n, arrVar) arrVar[n]

#define EXPAND_ARRAY(N, arrVar) \
  BOOST_PP_ENUM(N, ARRAY_ELEMENTS, arrVar)

#define EXPAND_CASE_Z(z, N, arrVar) \
 case N: cout << crawler(EXPAND_ARRAY(N, arrVar)).best_sum << endl; break;

// actually each OS has its own limitation for maximal number of arguments, see your
// OS docs for more info. Beware Boost.Preprocessor has its own limits for repeatable
// macros expansions
#define MAX_ARGS 100

int main(int argc, char* argv[]) {
    char** input = &argv[1];
    --args;
    switch(argc) {
    BOOST_PP_REPEAT_FROM_TO(1, MAX_ARGS, EXPAND_CASE_Z, input);
    }
}

但坦率地说,我怀疑变量模板函数是否会以这种方式使用。

答案 1 :(得分:0)

不,根据定义,您不能使用动态大小的数组(即其大小在执行时定义),并且编译时间大小减去。