请考虑下面的代码,它包含在我制作的库中。如何编写在C++中使用其他函数的函数
#include <complex>
std::complex<double> besselJ(int order, std::complex<double> z)
{
// Function call
}
std::complex<double> besselH1(int order, std::complex<double> z)
{
// Function call
}
注意两个函数都有相同的签名。现在,我想编写第三个函数,它执行的操作与besselJ
或besselH1
完全相同。我尝试以下
template<std::complex<double> (*T)(int, std::complex<double>)>
std::complex<double> diffBessel(int order, std::complex<double> z)
{
return T(order-1, z)-T(order+1,z);
}
当一个成员函数尝试使用语法diffbessel<besselJ>(int, std::complex<double>
,GCC抱怨说the value of 'besselJ' is not usable in a constant expression
。有关说明,请参阅this answer。
有没有办法做一些像上面的模板代码,如果它的工作而不是诉诸于struct
小号包装besselJ
和besselH1
会做什么?我认为结构会增加不必要的复杂性。
更新:这个工程很漂亮,就像@aschepler建议它应该那样。实际代码中存在名称冲突。这花了额外的第1001次看看。我被其他StackOverflow文章弄糊涂了,这些文章暗示这不起作用,因为函数指针是可变的。
链接的答案并不能解释为什么'diffbessel(args)'不起作用。据我所知,它应该工作。 –
aschepler
2013-03-07 21:47:00
你能显示GCC抱怨的确切代码吗? – Angew 2013-03-07 21:56:43
感谢你们俩。它**可以**工作。尽管我看了几个小时的代码,但我忽略了一个愚蠢的错误。 – 2013-03-07 22:12:46