sin到std :: sin的C ++别名 - 需要草率的快速修复

时间:2013-10-10 22:55:11

标签: c++ function c++11 namespaces alias

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

但我没有运气

任何提示? 感谢

3 个答案:

答案 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