考虑以下代码,它包含在我制作的库中。
#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
。请参阅此答案以获取解释。
有没有办法像上面的模板化代码一样,如果它在不使用包装besselJ
和besselH1
in struct
s 的情况下工作的话?我认为结构会增加不必要的复杂性。
更新:这很好用,正如@aschepler 建议的那样。实际代码中存在名称冲突。花了额外的第 1001 次看才能看到它。我对其他 StackOverflow 文章感到困惑,这些文章暗示这不起作用,因为函数指针是可变的。