在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::bind
解决lambda
方案,但在参数数量方面似乎仍然遇到错误。
当,在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 捕获变量(无捕获与捕获 lambda),它似乎无法转换为函数指针。所以我认为 Andy-Prowl 下面的答案通常是这个问题的正确答案,尽管我需要找到不同的解决方法。