在仍然使用它们的同时覆盖 cmath 函数的最佳方法是什么?

What would be the best approach to override cmath functions while still using them?

我正在尝试制作我自己的数学库,支持保留每个数学函数使用次数的统计信息。我希望所有函数都与 cmath 中的函数同名,这样我就可以轻松地在我的代码中用 cmath 替换我的数学库头文件并让它以相同的方式工作,只是没有统计信息。

到目前为止我试过这个:

my_math.hpp

float tanf(float ang);

my_math.cpp

#include <cmath>

float tanf(float ang)
{
    std::cout << "Custom tanf() used..." << std::endl;

    return std::tan((float)(ang));
}

这是最好的方法还是有更好的方法?

我尝试使用 return std::tanf(ang) 但出现“tanf 不是 std 的成员”的错误,尽管我可以在代码的其他部分使用 tanf,但我没有声明了自己的 tanf(虽然我永远不能使用 std::tanf)。

有没有办法做到这一点,以便我可以声明自己的函数与 cmath 中的函数同名,添加一些功能,然后使用 return 中的 cmath 版本?

扩展 ,假设这是某些 test-framework 类型的东西的一部分,这可以按您想要的方式工作吗?

// my_math.hpp
namespace jesper
{
    float tanf(float ang);
    /* more functions declarations */
}
// my_math.cpp
#include "my_math.hpp"
float jesper::tanf(float ang)
{
    /* function definition */
}
/* more function definitions */
// my_test_code.cpp
#include <cmath>
#include "my_math.hpp"

constexpr bool use_my_math = true; // switch this to change between std and jesper in helper functions

float generic_tanf(float ang)
{
    if constexpr (use_my_math)
        return jesper::tanf(ang);
    else
        return std::tanf(ang);
}
/* more helper functions */

int main()
{
    generic_tanf(0.1f);
}

这种风格会在编译时切换你所有的功能,你也可以使用其他方法进行编译时检查和 re-organise 事情很好。或者您可以在运行时使用类似的辅助函数来做一些事情。

你也许还可以做一些更类似于我认为你要求的事情,使用可怕的 using namepsace std 类型的东西,但是 this is usually advised against 因为你想要它的原因,它最可能会很糟糕。名称冲突通常是不可取的!