在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庫的類函數會更好。
在此先感謝!
[增訂]
@安迪警車:我想你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
選項。此外,如果它捕獲變量(capture-less vs. capturing lambdas),看起來lambda不能被轉換爲函數指針。所以我認爲Andy-Prowl的回答總的來說是這個問題的正確答案,但我需要找到一個不同的解決方法。
(我還沒有真正閱讀問題)綁定或拉姆達? – 2013-02-28 00:15:33
這些標籤有誤導性,應該包含matlab/lambda – Dmitry 2013-02-28 00:25:03
這些解決方案中的任何一個都可以正常工作嗎?是不是可以使用bind來代替函數指針? – 2014-09-04 21:36:07