मैं प्रभावी रूप से निम्न समस्या मिल गया है:(शून्य) के लिए एक 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
उन्हें नाम मत करो, संपादित करें तो यह केवल शिकायत करता है, तो अपने एक डीबग बिल्ड – aaronman
@aaronman वे नामित होने की जरूरत नहीं कर रही है, क्योंकि वे कर रहे हैं (सशर्त, '# DEBUG' के आधार पर) का इस्तेमाल किया। – Yuushi
ईमानदारी से यह बदसूरत लगता है लेकिन आप नाम को ifdef में भी डाल सकते हैं – aaronman