将struct拆分为函数参数列表

时间:2015-05-06 19:31:40

标签: c++ c dry

我的功能如下:

void funcName(arg1, arg2, arg3[ = someDefault], ... , argN)

我有一个像

这样的结构
struct Args
{
    arg1;
    ...
    argN;
}

如果我不能改变函数签名,那么从函数args到init结构是否有任何DRY和漂亮的解决方案以及将结构发送到函数中?

2 个答案:

答案 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;
}

Live example.

通过“将结构发送到函数”,您似乎意味着您希望按照它们声明的顺序从结构中获取每个字段,并将它们作为参数调用函数。很抱歉,但是没有办法做到这一点,因为这需要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)的问题。