gpt4 book ai didi

c++ - 如何在 C++ 中编写使用其他函数的函数

转载 作者:行者123 更新时间:2023-11-30 00:36:44 25 4
gpt4 key购买 nike

考虑以下代码,它包含在我制作的库中。

#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寻求解释。

有没有办法做一些像上面的模板代码那样的事情,如果它在不求助于包装的情况下工作 besselJbesselH1struct秒?我认为结构会增加不必要的复杂性。

更新:正如@a​​schepler 建议的那样,它工作得很好。实际代码中存在名称冲突。多看了 1001 次才看到它。我对其他 StackOverflow 文章感到困惑,这些文章建议这行不通,因为函数指针是可变的。

最佳答案

前提:

前提是besselJ在您的示例中是函数的名称,而不是您用作模板参数的变量的名称,然后将函数指针作为非类型模板参数传递< em>应该 工作。

查看 live example .

替代解决方案:

如果您的函数指针保存在一个变量中,该变量的值是在运行时计算的,您将不能将该函数指针用作模板参数。如果你想使用运行时函数指针,你可以只使用常规的函数参数而不是模板参数:

#include <complex>

std::complex<double> diffBessel(
std::complex<double> (*fxn)(int, std::complex<double>),
int order,
std::complex<double> z
)
{
return fxn(order-1, z) - fxn(order+1,z);
}

更多惯用的解决方案:(需要 C++11)

如果您想要更大的灵 active ,对于 C++11,您可以使用 std::function<> :

#include <complex>
#include <functional>

std::complex<double> diffBessel(
std::function<std::complex<double>(int, std::complex<double>)> fxn,
int order,
std::complex<double> z
)
{
return fxn(order-1, z)- fxn(order+1,z);
}

在这两种情况下,您的函数都可以这样调用:

int main()
{
std::complex<double> c;
/* ... */
diffBessel(besselH1, 2, c);
}

进一步的可能性:

还有一种可能性,如果您不想或不能使用 std::function<> ,你可以让你的函数接受任何可调用的对象,方法是将其设为模板:

template<typename F>
std::complex<double> diffBessel(
F f,
int order,
std::complex<double> z
)
{
return f(order-1, z) - f(order+1,z);
}

同样,您将以与调用之前版本完全相同的方式调用它。

关于c++ - 如何在 C++ 中编写使用其他函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com