我有效地遇到了以下问题:我希望能够使用-Wall -Wextra -Werror进行构建,但是,以下代码会抱怨未使用的参数:
struct foo { template <typename... Args> static void bar() { } template <typename T,typename ... Args> static void bar(T&& value,Args&& ... args) { #ifdef DEBUG std::cout << value; bar(std::forward<Args>(args)...); #endif } };
第一个未使用的参数很容易修复:
#ifdef DEBUG std::cout << value; bar(std::forward<Args>(args)...); #else // Shut the compiler up (void) value; #endif
我的问题是,我怎么能用其余的args做到这一点?也不
(void)(args...);
也不
(void)(args)...;
会工作,都抱怨参数包没有扩展.
(这是在GCC 4.7.3下,如果这对潜在的解决方案有任何影响).
解决方法
使用可变参数模板时,使用接收器更干净:
struct sink { template<typename ...Args> sink(Args const & ... ) {} }; #ifdef DEBUG std::cout << value; bar(std::forward<Args>(args)...); #else sink { value,args ... }; //eat all unused arguments! #endif