template<typename T, typename U = void>
struct S { /* static_assert(0, "type unsupported"); */ };
template<typename T>
struct S<T, typename std::enable_if<std::is_integral<T>::value, void>::type> {
void foo() {}
};
...
S<int> i;
i.foo();
S<double> d;
// d.foo();
मैं उम्मीद कर रहा होगा कि "मास्टर टेम्पलेट" कभी नहीं int
के मामले के लिए instantiated किया जाएगा, लेकिन अगर मैं static_assert
uncomment, S<int>
इन्स्टेन्शियशन असफल हो जायेगी। यहां तक कि एक अकेला typedef S<int> Si;
संकलित करने में विफल रहेगा। (जीसीसी 4.9.2 सिग्विन)static_assert
foo()
कॉल पर असफल होने के लिए S<double>
के लिए मुझे प्राप्त करने का लक्ष्य नहीं है, लेकिन टेम्पलेट के तत्काल होने पर, और एक सार्थक त्रुटि संदेश के साथ। मुझे पता है कि मैं मास्टर टेम्प्लेट में typename T::nonexistent_type t;
जैसे कुछ कर सकता हूं जो संकलन के लिए टेम्पलेट को रोक देगा, लेकिन यह static_assert
संदेश से कम होगा। (नोट: मास्टर टेम्पलेट में एक समारोह परिभाषा के दायरे में static_assert
डाल अभी भी S<int>
के लिए संकलन में विफल रहता है)
static_assert
क्यों असफल है, भले ही उस टेम्पलेट instantiated नहीं है? क्या यह मानक द्वारा अनिवार्य (या शायद "अनिर्दिष्ट") है? क्या static_assert
जिस तरह से मैं चाहता हूं उससे असफल होने का कोई तरीका है?
देखें ['static_assert' हमेशा क्यों आ जाता है?] (Http://stackoverflow.com/q/27738971/3953764) –