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_isnan_available :: value work? –
@トニー:両方のために 'std :: isnan'がオーバーロードされています。そして、それでもfloatからdoubleへの暗黙の変換があります。それでも、私は二重のために試して試しても動作しません。 –
@ TonyDelroy:良い考えですが、通常は標準の関数がオーバーロードされます。それでも、あなたはそれがまだ[ideone](http://www.ideone.com/U7EqO)で動作しないことを確認できます。 –