gpt4 book ai didi

c++ - 如何将 "cast"一个双参数函数转换为一个参数函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:59 25 4
gpt4 key购买 nike

在matlab中,可以这样写:

S = @(x,y) x^2+y^2-1
G = @(x) S(x,1);

如果我有一个需要单参数函数的函数,我可以执行上述操作。我如何在 c/c++ 中执行此操作?

我有一个库函数(来自 CGAL 库),它期望一个本身只有一个参数的函数作为参数。理想情况下,我有一个类 (SphericalHarmonics),我希望有一个接受一个参数的成员函数。所以我有:

FT SphericalHarmonics::distFunction(Point_3 p)

(注意 FT 是一个类似于 double 的类型)但是当然当我尝试

SphericalHarmonics *sh = new SphericalHarmonics(1);
Surface_3 surface(sh->distFunction, Sphere(ORIGIN,2.));

this 也被当作一个参数,我的 distFunction 函数是一个双参数函数,并抛出一个错误。

请注意,这可以通过全局变量来解决,即

SphericalHarmonics *sh;
FT dist_function(Point_3 p) {
return sh->distFunction(p);
}

main() {
sh = new SphericalHarmonics(1);
Surface_3 surface(dist_function);
}

但是,这确实不理想。我想要一种无需全局变量即可执行此操作的方法,因为能够拥有一个可轻松与 CGAL 库集成的类函数会更好。

提前致谢!

[更新]

@Andy-Prowl:我已经尝试了您的std::bindlambda 解决方案,但似乎仍然遇到关于参数数量的错误。

当在 main 中,我使用代码:

SphericalHarmonics *sh = new SphericalHarmonics(cInit, numL, symm);
auto fxn = std::bind(&SphericalHarmonics::distFunction, sh, std::placeholders::_1);
Surface_3 surface(fxn, Sphere_3(ORIGIN,2.));

我得到错误:

~/lib/basisfunctions/SphericalHarmonics2/mesh_an_implicit_function.cpp:62:48: 
error: no matching function for call to
‘CGAL::Implicit_surface_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>,
double (*)
(CGAL::Point_3<CGAL::Epick>)>::Implicit_surface_3(std::_Bind<std::_Mem_fn
<double (SphericalHarmonics::*)(CGAL::Point_3<CGAL::Epick>)>
(SphericalHarmonics*, std::_Placeholder<1>)>&, Sphere_3)’

~/CGAL-4.1/include/CGAL/Implicit_surface_3.h:50:5: note:   no known conversion 
for argument 1 from ‘std::_Bind<std::_Mem_fn<double (SphericalHarmonics::*)
(CGAL::Point_3<CGAL::Epick>)>(SphericalHarmonics*, std::_Placeholder<1>)>’ to
‘CGAL::Implicit_surface_3<CGAL::Robust_circumcenter_traits_3<CGAL::Epick>,
double (*)(CGAL::Point_3<CGAL::Epick>)>::Function
{aka double (*)(CGAL::Point_3<CGAL::Epick>)}’

~/CGAL-4.1/include/CGAL/Implicit_surface_3.h:34:9: note:   
candidate expects 1 argument, 2 provided

[更新]

现在我很清楚我需要一个可以转换为函数指针的函数(即 surface 需要一个函数指针参数)。这排除了 std::bind 选项。此外,如果 lambda 捕获变量 ( capture-less vs. capturing lambdas ),它似乎无法转换为函数指针。所以我认为 Andy-Prowl 下面的回答通常是这个问题的正确答案,尽管我需要找到不同的解决方法。

最佳答案

选项 1:

如果您的成员函数不隐式地作用于您的类的实例(因此不需要接收this 指针),您可以将其设为static:

class SphericalHarmonics
{
...
static double distFunction(Point p);
...
};

double SphericalHarmonics::distFunction(Point p)
{
...
}

现在,您的函数实际上只有一个参数:

surface(SphericalHarmonics::distFunction);

选项 2:

否则,您可以使用 std::bind()柯里化(Currying)成员函数 distFunction 并修复它的第一个隐式参数(如果您不使用 C++11 编译器,则可以使用等效的 boost::bind() 来自 Boost.Bind 库):

#include <functional>

SphericalHarmonics *sh = new SphericalHarmonics(1);
auto fxn = std::bind(&SphericalHarmonics::distFunction, sh, _1);
surface(fxn);

选项 3:

或者,在 C++11 中,lambda 可以完成这项工作:

SphericalHarmonics *sh = new SphericalHarmonics(1);
auto fxn = [=] (double d) { return sh->distFunction(d); }

关于c++ - 如何将 "cast"一个双参数函数转换为一个参数函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15125106/

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