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

Yuu*_*shi 8 c++ variadic-templates c++11

我有效地遇到了以下问题:我希望能够构建-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
    }
};
Run Code Online (Sandbox Code Playgroud)

第一个未使用的参数很容易修复:

    #ifdef DEBUG
        std::cout << value;
        bar(std::forward<Args>(args)...);
    #else // Shut the compiler up
        (void) value;
    #endif
Run Code Online (Sandbox Code Playgroud)

我的问题是,我怎么能用剩下的args呢?也不

(void)(args...);
Run Code Online (Sandbox Code Playgroud)

也不

(void)(args)...;
Run Code Online (Sandbox Code Playgroud)

会工作,都抱怨参数包没有扩展.

(这是在GCC 4.7.3下,如果这对潜在的解决方案有任何影响).

Naw*_*waz 9

使用可变参数模板时,使用接收器更干净:

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
Run Code Online (Sandbox Code Playgroud)