【发布时间】:2019-07-07 17:21:07
【问题描述】:
通常,在 C99 中,您可以通过使用 VA_ARGS 和某种宏技巧来实现函数重载(参数数量,而不是类型重载):
#define THIRD_PARAMETER(_1,_2,_3,...) _3
#define NOTHING
例如:
void pr1(int x);
void pr2(int x, int y);
#define pr(...) THIRD_PARAMETER(__VA_ARGS__, pr2, pr1, NOTHING)(__VA_ARGS__)
(我添加了NOTHING 宏,这样当我调用pr(100) 来打印100 时,C99 不会抱怨传递给... 的零参数,我希望我的程序与C99 完全兼容)
但问题是:pr 不是函数,所以不能赋值给结构体内部的函数指针:
// this is a dynamic array
struct array {
// ...
void (*insert)(struct array * a, ...);
// ...
};
假设我有 3 个版本的插入:single_insert、multiple_insert、range_insert,它们分别有 3、4、5 个参数。如何在 C99 结构中实现函数重载(参数数量)?有可能吗?
【问题讨论】:
-
对不起,但这似乎是灾难的根源。为什么不直接将正确的函数分配给你的结构呢?
-
我认为这将是一个不错的接口:我可以避免其他数据类型版本之间的名称差异。例如:我有
int、float版本:我只是调用myarray.insert(...)而不是insert_int(&myarray, ...)、insert_float(&myarray, ...) -
对,您可以通过将您想要的版本显式分配给结构中的指针来实现。重载只会混淆。
-
此外,类型安全存在 var-args 问题,这会让我犹豫是否真的需要这样做。 C11 引入_Generic;它可能是您正在寻找的。span>