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
    }
};

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

    #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 下,如果这会对潜在的解决方案产生任何影响)。

4

3 回答 3

12

使用可变参数模板时,使用 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
于 2013-10-23T04:09:11.117 回答
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)) {}
于 2013-10-23T11:01:36.360 回答
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
于 2019-03-22T23:25:47.493 回答