正在将动态数组元素解析为参数?(变音符)
Parsing dynamic-array elements as arguments? (variadic)
试图找到一个(可能)预处理技巧,它将做类似于下一个伪C++的事情
myVariadicFun(argv[0],argv[1],argv[2],...,argv[argc] );
variadic函数已经准备好并可以工作,只需要解析其中的数组参数。
之所以不只是传递一个数组指针,是因为我实际上在玩constexpr/元编程。
否,根据定义,您不能使用带有编译时间大小推导的动态大小数组(即其大小在执行时定义)。
使用[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);
}
}
但坦率地说,我怀疑可变模板函数是否打算以这种方式使用。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 正在将动态数组元素解析为参数?(变音符)