如何不使用&运算符实现可变参数列表?能否使用va_copy?
问题解答
首先明确:va_copy无法解决你的需求。它的作用是复制va_list对象,用于保存可变参数列表的遍历位置,和是否需要使用&运算符传递地址完全无关。
针对你想避免写&的需求,分两种场景给出可行方案:
1. C++环境下的彻底解决
C++的引用特性可以直接替代指针实现外部变量修改,无需显式取地址:
方案一:重载函数(单参数场景)
针对不同类型分别实现重载版本,调用时直接传变量名即可:
void list_test(int index, int& var) { var = GetNumber(index); } void list_test(int index, bool& var) { var = GetEnable(index); }
调用示例:
list_test(0, var_int); // 无需写& list_test(0, var_bool); // 无需写&
方案二:模板参数包(多参数场景)
如果需要一次传递多个不同类型的变量,用模板参数包实现批量处理:
#include <type_traits> template<typename... Args> void list_test(int start_index, Args&... args) { int current_idx = start_index; // 逐个匹配类型并赋值 ( [&](){ if constexpr (std::is_same_v<std::decay_t<decltype(args)>, int>) { args = GetNumber(current_idx++); } else if constexpr (std::is_same_v<std::decay_t<decltype(args)>, bool>) { args = GetEnable(current_idx++); } }(), ... ); }
调用示例:
list_test(0, var_int, var_bool); // 无需写&,自动处理每个变量
2. C语言环境下的语法简化
C语言没有引用特性,无法完全避免传递地址,但可以用宏做语法糖,让调用时不用显式写&:
// 定义递归宏自动为每个参数添加& #define ADD_ADDR(var) &var #define FOR_EACH(func, first, ...) func(first) FOR_EACH_NEXT(func, __VA_ARGS__) #define FOR_EACH_NEXT(func, first, ...) , func(first) FOR_EACH_NEXT(func, __VA_ARGS__) #define FOR_EACH_NEXT(func) // 封装后的调用宏 #define LIST_TEST(index, ...) list_test(index, FOR_EACH(ADD_ADDR, __VA_ARGS__))
调用示例:
LIST_TEST(0, var_int, var_bool); // 等价于list_test(0, &var_int, &var_bool)
这种方式只是语法层面的简化,本质还是传递地址,但调用时不用手动写&。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

