請考慮下面的代碼,它包含在我製作的庫中。如何編寫在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