将结构拆分为函数参数列表的最佳方法
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;
}
"sending structure into function" 看来您的意思是您希望按照声明的顺序从结构中获取每个字段,并以它们作为参数调用函数。抱歉,没有很好的方法来做到这一点,因为这需要 compile-time reflection,这是在进一步的 C++ 版本中添加的主题,但语法甚至还不清楚。
如果您可以使用 tuple
s 而不是结构,那就很简单了。
如果您绝对需要,有一种不太漂亮的方法可以做到这一点。有一个 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)没有问题。
我有这样的功能:
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;
}
"sending structure into function" 看来您的意思是您希望按照声明的顺序从结构中获取每个字段,并以它们作为参数调用函数。抱歉,没有很好的方法来做到这一点,因为这需要 compile-time reflection,这是在进一步的 C++ 版本中添加的主题,但语法甚至还不清楚。
如果您可以使用 tuple
s 而不是结构,那就很简单了。
如果您绝对需要,有一种不太漂亮的方法可以做到这一点。有一个 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)没有问题。