C++如何传递哑参数跳过不需要的函数输出参数 无需定义额外变量
C++ 跳过输出参数的简洁实现方案
你需要的类似Python中_占位符的效果可以通过自定义通用哑元占位符实现,完全不需要额外定义无用变量,以下是具体方案:
推荐方案:全局通用占位符
这种方案复用性最高,一次定义所有场景都可以使用,和Python的_使用体验完全一致:
- 先定义通用哑元模板和全局实例
template <typename T> struct dummy_t { // 隐式转换为任意类型的左值引用 operator T&() const { thread_local T dummy; // 加thread_local适配多线程场景,单线程可以去掉 return dummy; } }; // 全局占位符实例,直接用_作为变量名符合Python使用习惯 inline constexpr dummy_t<void*> _;
- 调用函数时直接用
_占位不需要的输出参数即可,你的示例代码修改后如下:
#include <iostream> template <typename T> struct dummy_t { operator T&() const { thread_local T dummy; return dummy; } }; inline constexpr dummy_t<void*> _; /** * Calculates multiples of number * * @param[in] t1 number to multiply * @param[out] t2 multiplied by 2 * @param[out] t3 multiplied by 3 */ void calc_multiples(const int t1, int &t2, int &t3) { t2 = 2*t1; t3 = 3*t1; return; } int main() { int myNum = 7; // 不需要定义无用的myNumTimes2变量 int myNumTimes3; // 直接用_占位第二个输出参数 calc_multiples(myNum, _, myNumTimes3); std::cout << "my number times 3: " << myNumTimes3; return 0; }
临时单次使用方案
如果你不想额外定义全局变量,只是偶尔需要跳过某个输出参数,可以直接用匿名lambda生成临时哑变量:
calc_multiples(myNum, *[](){static int dummy; return &dummy;}(), myNumTimes3);
这种方案不需要提前定义任何内容,缺点是单次写法较长,适合不常用的场景。
注意事项
- 上述方案对所有可默认构造的类型都生效,自定义类作为输出参数也可以正常使用
- 如果明确不会在多线程环境下使用,可以去掉
thread_local修饰进一步简化代码
内容的提问来源于stack exchange,提问作者Markus Dutschke
相关产品推荐
相关产品推荐

