私が作成したライブラリに含まれている次のコードを考えてみましょう。
#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
ここで、 に作用する場合でも に作用する場合でもまったく同じことを行う 3 番目の関数を書きたいと思います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
上記のテンプレート化されたコードが、ラッピングやsbesselH1
に頼らずに機能する場合に行うようなことを行う方法はありますか? struct
構造体は不要な複雑さを追加すると思います。
更新: @ashepler が提案したように、これは美しく機能します。実際のコードで名前の衝突がありました。それを見るのに、さらに1001回目を要しました。関数ポインターが可変であるため、これが機能しないことを示唆する他の StackOverflow 記事に混乱していました。