【问题标题】:The best way to split struct into function argument list将结构拆分为函数参数列表的最佳方法
【发布时间】:2015-05-06 19:31:40
【问题描述】:

我有这样的功能:

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

我有一个类似的结构

struct Args
{
    arg1;
    ...
    argN;
}

如果我无法更改函数签名,是否有任何干燥且漂亮的解决方案可以从函数 args 初始化结构并将结构发送到函数?

【问题讨论】:

  • 查看this question中的第二个答案,它可能会帮助你做你想做的事。
  • C 还是 C++?然后,您是在使用 va_args 还是如何传递变量?你知道你有多少吗?或者它是完全可变的?我猜这是一个固定的金额,但可能是错误的。
  • @Khaldor,是的,its fixed amount. But its 可以更改一段时间!我想实现两个目标:我想在我可以操作的地方(它更舒服)和我想得到编译错误,当出现问题时(例如在对象结构中附加文件而不改变函数接口)。关于 C++ 的问题,但我认为如果有任何纯 C 的解决方案,它也适用于 C++。

标签: c++ c dry


【解决方案1】:

当然,但那是 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++ 版本中添加的主题,但语法还不清楚。

如果您可以使用tuples 代替结构,那么这很容易。

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

【讨论】:

  • 我认为他正在寻找相反的东西。给定一个struct,使用struct 的成员调用一个函数。
  • @RSahu 我认为 OP 想从函数 solution to init structure from function args 创建结构
  • @pvl 我已经更新了帖子。您需要 Boost Fusion 使用示例吗?
  • @pvl 所以你还想获取结构的所有成员并将它们作为单独的参数传递给函数?
  • @pvl 是的,有一个关于几种语言提案的邮件列表,如果我没记错的话,它叫做SG7。 (编辑:groups.google.com/a/isocpp.org/forum/?fromgroups#!forum/…)。
【解决方案2】:

您可以使用宏来做到这一点。它绝对不漂亮,但它高度兼容(适用于 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)没有问题。

【讨论】:

  • 天啊。对不起,它不漂亮
  • 嘿,我告诉过你它不漂亮。但是 C++ 并没有很强的自省能力——我很确定你不能单独使用模板系统将一个结构分解成单独的函数参数。
  • ...但是,它确实有效,您可以为自己定义更多宏以使其更漂亮:P
  • 实际上这是一个最漂亮的问题解决方案(以一些库的存在为模,可以帮助您避免一些样板文件)。
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多