在仍然使用它们的同时覆盖 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 因为你想要它的原因,它最可能会很糟糕。名称冲突通常是不可取的!
我正在尝试制作我自己的数学库,支持保留每个数学函数使用次数的统计信息。我希望所有函数都与 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 版本?
扩展
// 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 因为你想要它的原因,它最可能会很糟糕。名称冲突通常是不可取的!