我实际上遇到了以下问题:我希望能够使用-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下,如果这对潜在的解决方案有任何影响)。
答案 0 :(得分:9)
使用variadic模板时,使用sink更简洁:
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
答案 1 :(得分:1)
你可以在这里使用条件命名。
#ifdef DEBUG
#define DEBUG_NAME(x) x
#else
#define DEBUG_NAME(x)
#endif
static void bar(T&& DEBUG_NAME(value), Args&& DEBUG_NAME(args)) {}
答案 2 :(得分:0)
解决此问题的另一种方法是移动#define创建一个备用模板,该模板忽略参数名称:
#ifdef DEBUG
template <typename T, typename ... Args>
static void bar(T&& value, Args&& ... args)
{
std::cout << value;
bar(std::forward<Args>(args)...);
}
#else
template <typename T, typename ... Args>
static void bar(T&& value, Args&& ...)
{
}
#endif