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

标签 c++ c++11 variadic-templates

我实际上遇到了以下问题:我希望能够使用 -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 下,如果这对潜在的解决方案有任何影响的话)。

最佳答案

使用可变参数模板时,使用 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

关于c++ - 将可变参数包转换为 (void),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19532475/

相关文章:

c++ - 复制列表初始化是否在概念上调用复制构造函数?

c++ - 递归地使用列表STL进行插入排序

c++ - 编译但每次都崩溃#class template c++

c++ - 类模板的可变参数构造函数模板的特化

C++,将自定义占位符与函数参数匹配

C++11 标准决定 "shared_ptr(const weak_ptr<Y>& r) Throws bad_weak_ptr"

c++ - 从具有非虚拟析构函数的容器继承

c++ - 静态成员定义中的双 `template` 关键字

c++ - 使用参数包扩展生成 Constexpr

c++ - 单声道嵌入: How to access type of a property in C/C++