2013-10-23 19 views
6

मैं प्रभावी रूप से निम्न समस्या मिल गया है:(शून्य) के लिए एक variadic पैरामीटर पैक कास्टिंग

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

: मैं -Wall -Wextra -Werror साथ निर्माण करने के लिए, तथापि, निम्नलिखित कोड अप्रयुक्त मापदंडों के बारे में शिकायत करेंगे सक्षम होना चाहते हैं ,

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

मेरा प्रश्न है कि कैसे मैं शेष args के साथ ऐसा कर सकते हैं: पहले अप्रयुक्त पैरामीटर तय करने के लिए आसान है? न तो

(void)(args...); 

न ही

(void)(args)...; 

काम करेंगे, दोनों नहीं विस्तार किया जा रहा पैरामीटर पैक के बारे में शिकायत करते हैं।

(यह जीसीसी 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 
+0

उन्हें नाम मत करो, संपादित करें तो यह केवल शिकायत करता है, तो अपने एक डीबग बिल्ड – aaronman

+0

@aaronman वे नामित होने की जरूरत नहीं कर रही है, क्योंकि वे कर रहे हैं (सशर्त, '# DEBUG' के आधार पर) का इस्तेमाल किया। – Yuushi

+0

ईमानदारी से यह बदसूरत लगता है लेकिन आप नाम को ifdef में भी डाल सकते हैं – aaronman

उत्तर

9

जब variadic टेम्पलेट के साथ काम कर, इसे और अधिक सिंक का उपयोग करने के साफ है।

#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

यह संभवतः समाधान के साथ जाएगा, लेकिन मैं अभी भी कुछ उत्सुक हूं कि प्रश्न में कोड क्यों काम नहीं करता है। – Yuushi

+0

@ युसुशी: कुछ संदर्भ हैं जहां विविध तर्क स्वयं को अनपॅक कर सकते हैं। आपके संदर्भ में वे अनपॅक नहीं करते हैं। [यह विषय] देखें (http://stackoverflow.com/questions/17652412/what-are-the-rules-for-the-token-in-the-context-of-variadic- टेम्पलेट)। – Nawaz

+0

आह, लिंक के लिए धन्यवाद। यह उस को साफ़ करता है ... – Yuushi

1

:

+0

शरीर को अभी भी '#ifdef DEBUG' की आवश्यकता है, हालांकि अब' # else' नहीं है। – Nawaz

संबंधित मुद्दे