मैं परीक्षण करने के लिए एक हैक के साथ आने का प्रयास कर रहा था अगर std::isnan
प्रीप्रोसेसर में विशेष आवरण कंपाइलर के बिना परिभाषित किया गया है, और निम्न के साथ आया, जिसे मैं ठीक काम करने की उम्मीद कर रहा था।SFINAE किसी अन्य नामस्थान से मुक्त फ़ंक्शन का परीक्षण करने के लिए
#include <cmath>
#include <type_traits>
namespace detail {
using namespace std;
struct dummy {};
void isnan(dummy);
//bool isnan(float); // Just adding this declaration makes it work!
template <typename T>
struct is_isnan_available {
template <typename T1>
static decltype(isnan(T1())) test(int);
template <typename>
static void test(...);
enum { value = !std::is_void<decltype(test<T>(0))>::value };
};
}
int main() {
return detail::is_isnan_available<float>::value;
}
it doesn't detect it बाहर निकलता है। मुझे पता है कि कुछ std::isnan
को विचारधारा पर परिभाषित किया गया है, क्योंकि मैंने मैन्युअल रूप से परीक्षण किया था।
और जब मैं uncomment the marked line above, यह काम करता है।
मुझे यहां क्या याद आ रही है? इस व्यवहार को क्या समझाता है?
उत्सुक: is_isnan_available :: मूल्य कार्य? –
@ टोनी: 'std :: isnan' दोनों के लिए अधिभारित है। और फिर भी, फ्लोट से डबल तक एक अंतर्निहित रूपांतरण है। फिर भी, मैंने कोशिश की और डबल के लिए परीक्षण या तो काम नहीं करता है। –
@ टोनीडेलॉय: अच्छा विचार, हालांकि मानक कार्यों को आम तौर पर अधिभारित किया जाता है। इसके बावजूद, आप यह जांच सकते हैं कि यह अभी भी [ideone] (http://www.ideone.com/U7EqO) पर काम नहीं करता है –