2013-10-23 10 views
6

Ich habe effektiv folgendes Problem: Ich möchte mit -Wall -Wextra -Werror jedoch bauen zu können, der folgende Code wird über nicht verwendete Parameter beschweren:einen variadische Parameter Pack (void) Casting

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

Die zunächst nicht verwendeter Parameter ist einfach zu beheben:

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

Meine Frage ist, wie kann ich dies tun, mit args den übrigen? Weder

(void)(args...); 

Nor

(void)(args)...; 

arbeiten, klagen sowohl über den Parameter Pack nicht erweitert.

(Dies ist unter GCC 4.7.3, wenn das für eine mögliche Lösung einen Unterschied machen wird).

+0

Sie nennen sie nicht, zu bearbeiten, so dass es beschwert sich nur, wenn Ihr nicht ein Debug-Build – aaronman

+0

@aaronman Sie werden genannt haben zu tun, weil sie (bedingt, je nach '# DEBUG') verwendet. – Yuushi

+0

Ehrlich klingt das hässlich, aber Sie könnten den Namen in ein ifdef auch setzen – aaronman

Antwort

9

Wenn mit variadische Vorlage arbeitet, ist es mehr sauber Spüle zu verwenden:

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 
+0

Das ist wahrscheinlich die Lösung, mit der ich gehen werde, aber ich bin immer noch etwas neugierig, warum der Code in der Frage nicht funktioniert. – Yuushi

+0

@Yuushi: Es gibt bestimmte Kontexte, in denen variadic Argumente sich auspacken können. In deinem Kontext entpacken sie nicht. Siehe [dieses Thema] (http://stackoverflow.com/questions/17652412/what-are-the-rules-for-the-token-in-the-context-of-variadic-template). – Nawaz

+0

Ah, danke für den Link. Das klärt das auf ... – Yuushi

1

Sie wirklich mit bedingter Namensgebung hier gehen könnten.

#ifdef DEBUG 
#define DEBUG_NAME(x) x 
#else 
#define DEBUG_NAME(x) 
#endif 

static void bar(T&& DEBUG_NAME(value), Args&& DEBUG_NAME(args)) {} 
+0

Der Körper braucht noch '#ifdef DEBUG', allerdings nicht mehr '# else'. – Nawaz

Verwandte Themen