我試圖想出一個黑客來測試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
是在ideone上定義的,因爲我手動測試過。
而當我uncomment the marked line above,它的工作原理。
我在這裏錯過了什麼?什麼解釋了這種行爲?
好奇:is is_isnan_available ::價值工作? –
2012-01-06 11:00:55
@Tony:'std :: isnan'對於兩者都是過載的。即使如此,還是有一個從float到double的隱式轉換。儘管如此,我嘗試過,雙測試也不起作用。 – 2012-01-06 11:03:29
@TonyDelroy:好的想法,但是標準函數通常是超載的。仍然爲它,你可以檢查它仍然無法在[ideone](http://www.ideone.com/U7EqO) – 2012-01-06 11:04:40