2

我有一个客户端试图在一个过时的编译器上编译,该编译器似乎没有来自 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

但我没有运气

有小费吗?谢谢

4

3 回答 3

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已定义:您需要设置一个合适的宏名称。

于 2013-10-10T23:07:53.557 回答
2

一种选择是像这样使用对函数的引用......

#include <math.h>
namespace std
{
    typedef double (&sinfunc)(double);
    static const sinfunc sin = ::sin;
}
于 2013-10-10T23:05:13.750 回答
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_);
   }
}

如果sin命名空间 std 中存在 ' ',它将直接使用double. 如果不是,则该值将被隐式转换为“ MYLIB_double”,并且将调用重载,该重载将sin在全局命名空间中调用stdor(因为std::sin(double)不存在)。您可能需要浮动等重载。

另一个可能更好的建议是添加一个他们可以使用的条件:

#ifdef MYLIB_NO_STD_SIN
namespace std {
   inline double sin(double x) {
        return ::sin(x);
   }
}
#endif
于 2013-10-10T23:17:04.880 回答