我试图想出一个技巧来测试是否std::isnan
在预处理器中没有特殊的套管编译器定义,并想出了以下内容,我希望它可以正常工作。
#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;
}
原来它没有检测到它。我知道肯定std::isnan
是在ideone上定义的,因为我手动测试过。
当我取消注释上面的标记行时,它就起作用了。
我在这里想念什么?什么解释了这种行为?