我有一个客户端试图编译一个过时的编译器,它似乎没有来自c ++ 11的std :: sin和std :: cos。 (他们无法升级) 我正在寻找某种快速修复方法来进入标题的顶部以使std :: sin指向sin等。 我一直在尝试像
这样的事情#ifndef std::sin
something something
namespace std{
point sin to outside sin
point cos to outside cos
};
#endif
但我没有运气
任何提示? 感谢
答案 0 :(得分:3)
原则上,它应该可以使用
#include <math.h>
namespace std {
using ::sin;
using ::cos;
}
然而,其中一些功能以有趣的方式实现,您可能需要使用类似的东西:
#include <math.h>
namespace std {
inline float sin(float f) { return ::sinf(f); }
inline double sin(double d) { return ::sin(d); }
inline long double sin(long double ld) { return ::sinl(ld); }
inline float cos(float f) { return ::cosf(f); }
inline double cos(double d) { return ::cos(d); }
inline long double cos(long double ld) { return ::cosl(ld); }
}
请注意,这些方法都不是可移植的,它们可能会也可能不会起作用。另请注意,您无法测试正在定义的std::sin
:您需要设置合适的宏名称。
答案 1 :(得分:2)
一个选项是使用对函数的引用,如此...
#include <math.h>
namespace std
{
typedef double (&sinfunc)(double);
static const sinfunc sin = ::sin;
}
答案 2 :(得分:1)
您不应该污染std命名空间,但以下操作可能有效:
struct MYLIB_double {
double v_;
MYLIB_double (double v) : v_(v) {}
};
namespace std {
inline double sin(MYLIB_double d) {
return sin(d.v_);
}
}
如果命名空间std中存在“sin
”,则将使用double
的参数直接调用它。如果没有,那么该值将被隐式转换为“MYLIB_double
”,并且将调用重载,该调用将在sin
或(从std
开始调用std::sin(double)
不存在),全局命名空间。您可能需要重载浮动等。
另一个可能更好的建议是添加一个他们可以使用的条件:
#ifdef MYLIB_NO_STD_SIN
namespace std {
inline double sin(double x) {
return ::sin(x);
}
}
#endif