将结构拆分为函数参数列表的最佳方法

The best way to split struct into function argument list

我有这样的功能:

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

我有一个像

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

如果我不能更改函数签名,是否有任何 DRY 和漂亮的解决方案来从函数参数初始化结构并将结构发送到函数中?

当然可以,但那是 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.

"sending structure into function" 看来您的意思是您希望按照声明的顺序从结构中获取每个字段,并以它们作为参数调用函数。抱歉,没有很好的方法来做到这一点,因为这需要 compile-time reflection,这是在进一步的 C++ 版本中添加的主题,但语法甚至还不清楚。

如果您可以使用 tuples 而不是结构,那就很简单了。

如果您绝对需要,有一种不太漂亮的方法可以做到这一点。有一个 Boost Fusion 库。它允许通过宏向 structures 添加反射,以便可以将它们转换为元组。

你可以用宏来完成。它绝对不漂亮,但它是高度兼容的(适用于 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)没有问题。