如何忽略C++参数包中的实参?
如何消除参数包中未使用实参的警告?
直接写(void)args;编译失败是因为args是参数包而非单个变量,没法直接转换为void。针对参数包,你可以用折叠表达式来逐个处理每个实参:
在非调试分支中替换成:
((void)args, ...);
修改后的完整代码如下:
template<bool Debug = DebugMode, typename... Arg> void log_debug(const Arg&... args) { if constexpr(Debug) { (std::clog << ... << args) << std::endl; } else { // 非调试模式下主动忽略实参,消除警告 ((void)args, ...); } }
原理说明
折叠表达式会把参数包args展开为(void)arg1, (void)arg2, ..., (void)argN的形式,逗号表达式会依次对每个实参执行(void)转换。编译器会判定每个参数都被“使用”,从而消除未使用变量的警告,同时这个转换不会生成任何实际机器码,完全不影响运行性能。
内容的提问来源于stack exchange,提问作者user3001150
相关产品推荐
相关产品推荐

