我试图想出一个 hack 来测试是否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;
}
事实证明它没有检测到它 http://www.ideone.com/mixN1。我确定std::isnan
是在 ideone 上定义的,因为我手动测试了它。
当我取消上面标记行的注释 http://www.ideone.com/Bi3mp, 有用。
我在这里缺少什么?如何解释这种行为?
问题是,using 指令不会将成员添加到当前命名空间,因此std::
成员仍然可以被此命名空间中的声明隐藏。
using std::isnan
相反,其行为就像将导入的命名空间的成员添加到包含use
-location 和导入的命名空间。 using 声明是命名空间中的普通声明,因此可以使用后面的声明参与重载决策。
但是,正如评论中指出的,如果该函数不存在,则会产生错误。要解决这个问题,您需要把它从你的detail::那么命名空间 http://www.ideone.com/MzY2x。这应该可行,因为导入的定义将与导入的定义处于同一级别dummy
超载。您可以将重载带到全局命名空间,也可以创建一个辅助命名空间(在全局命名空间中)并两者都导入 http://www.ideone.com/hdMnk.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)