我的功能如下:
void funcName(arg1, arg2, arg3[ = someDefault], ... , argN)
我有一个像
这样的结构struct Args
{
arg1;
...
argN;
}
如果我不能改变函数签名,那么从函数args到init结构是否有任何DRY和漂亮的解决方案以及将结构发送到函数中?
答案 0 :(得分:3)
当然,但那是C ++ 11。
struct xy {
int x, y;
};
template <class... T>
xy f(T... args) {
return xy{args...};
}
int main() {
xy a = f(1, 2);
cout << a.y << endl;
}
通过“将结构发送到函数”,您似乎意味着您希望按照它们声明的顺序从结构中获取每个字段,并将它们作为参数调用函数。很抱歉,但是没有办法做到这一点,因为这需要compile-time reflection,这是在其他C ++版本中添加的主题,但语法尚不清楚。
如果您可以使用tuple
而不是结构,那么很容易。
如果你绝对需要,有一种不太好的方法可以做到这一点。有一个Boost Fusion库。它允许通过宏向structures添加反射,以便可以将它们转换为元组。
答案 1 :(得分:1)
您可以使用宏来完成。它绝对不漂亮,但它高度兼容(适用于C,C ++ 03等):
在标头文件args.h
中:
#define ARGS_STRUCT ARG(int, arg1) SEP ARG(char *, arg2) SEP ARG(void *, arg3)
#undef ARG
#undef SEP
您可以将结构声明为
struct Args {
#define ARG(type, name) type name
#define SEP ;
#include "args.h"
};
和函数
int func(
#define ARG(type, name) type name
#define SEP ,
#include "args.h"
);
使用
初始化结构struct Args args = {
#define ARG(type, name) name
#define SEP ,
#include "args.h"
};
用
传递参数struct Args args;
func(
#define ARG(type, name) args.name
#define SEP ,
#include "args.h"
);
经过测试,没有Clang和Clang ++(均为6.1)的问题。