2016-10-16 3 views
7

एक बार (यहां तक ​​कि इसी तरह) मैं इस तरह कोड को देखा है की तुलना में अधिक:खराब गठित कार्यक्रमों के कारण गार्ड पैरामीटर पैक की जांच की जाती है?

template<typename U, typename... G, typename T = Traits<U>> 
struct { 
    static_assert(sizeof...(G) == 0, "!"); 
    // ... 
}; 

या इस:

template<typename T, typename... G, typename = std::enable_if_t<condition<T>> 
void func(T &&t) { 
    static_assert(sizeof...(G) == 0, "!"); 
    // .... 
} 

आशय उन कुछ कर रही द्वारा खेल के नियम को तोड़ने से बचने के लिए था इस तरह:

template<typename T, typename = std::enable_if_t<std::is_same<T, int>> 
void func(T &&t) { 
    // .... 
} 

// ... 

func<int&, void>(my_int); 

गार्ड पैरामीटर पैक के साथ, डिफ़ॉल्ट मान ओवरराइड नहीं किया जा सकता है।
दूसरी तरफ, आकार की जांच बेकार पैरामीटर के साथ विशेषज्ञता के प्रदूषण से बचाती है।

वैसे भी, क्योंकि [temp.res/8] की, हम उस राशि:

कार्यक्रम बीमार बनाई है, कोई निदान के लिए आवश्यक है, अगर:
[...]
- एक variadic टेम्पलेट के हर वैध विशेषज्ञता एक खाली टेम्पलेट पैरामीटर पैक की आवश्यकता है, या
[...]

इसलिए, प्रोग्राम हैं जो कि ऊपर उल्लेख किया के टुकड़े होते हैं बीमार का गठन या नहीं कर रहे हैं?

+3

हां। यही कारण है कि अनुभवी टीएमपीएलर एक क्लास टेम्पलेट का उपयोग करेंगे जो 'static_assert' स्थिति निर्धारित करने के लिए पैक के आकार और 'टी' दोनों लेता है। (हालांकि मुझे नहीं पता कि अनुभवी टीएमपीएलर वास्तव में पहले स्थान पर इस दृष्टिकोण के साथ जाएंगे।) – Columbo

+3

मुझे पहले स्थान पर पैरामीटर पैक का उपयोग करने में बिंदु नहीं दिखाई देता है, तो आप केवल 'टेम्पलेट <टाइपनाम' का उपयोग कर सकते हैं टी, std :: enable_if_t , int> = 0> 'जिसे उपयोगकर्ता द्वारा अवरुद्ध नहीं किया जा सकता है और इसे ऑन-ऑफ SFINAE में भी उपयोग किया जा सकता है। – Corristo

+0

@ कोरिस्टो, इस तरह के कोड कभी नहीं लगते हैं। अच्छी चाल! – paulotorrens

उत्तर

8

एक बीमार गठित कार्यक्रम में "चाल" परिणाम, कोई निदान आवश्यक नहीं है।

मानक आपके द्वारा उद्धृत अनुभाग में स्पष्ट रूप से बताता है।

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