c – 将可变参数包转换为(void)

我有效地遇到了以下问题:我希望能够使用-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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...