w Matlab, można napisać:Jak "rzucić" funkcję dwuargumentową do funkcji jednoargumentowej?
S = @(x,y) x^2+y^2-1
G = @(x) S(x,1);
Jeśli mam funkcji spodziewa funkcję jednego argumentu, mogę zrobić to powyżej. Jak mogę to zrobić w c/C++?
Mam funkcję biblioteczną (z biblioteki CGAL), która oczekuje jako argument funkcji, która sama ma tylko jeden argument. Idealnie, mam klasy (SphericalHarmonics
) i chciałbym mieć funkcję członka, który ma jeden argument. Tak mam:
FT SphericalHarmonics::distFunction(Point_3 p)
(zauważ, że FT
jest rodzajem podobny do double
), ale oczywiście, gdy próbuję
SphericalHarmonics *sh = new SphericalHarmonics(1);
Surface_3 surface(sh->distFunction, Sphere(ORIGIN,2.));
this
jest również traktowane jako argument, mój distFunction
funkcja jest dwu- funkcja argumentu i zgłaszany jest błąd.
Zauważ, że to może być rozwiązany z zmienne globalne, tzn
SphericalHarmonics *sh;
FT dist_function(Point_3 p) {
return sh->distFunction(p);
}
main() {
sh = new SphericalHarmonics(1);
Surface_3 surface(dist_function);
}
Jednak jest to naprawdę nie idealny. Chciałbym, aby to zrobić bez zmiennych globalnych, ponieważ byłoby znacznie lepiej móc mieć funkcję klasy, która łatwo integruje się z biblioteką CGAL.
Z góry dziękuję!
[AKTUALIZACJA]
@ Andy-Prowl: Próbowałem swoje rozwiązania std::bind
i lambda
, ale wciąż wydaje się być uruchomiony do błędów w odniesieniu do liczby argumentów.
Kiedy w main
używam kod:
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.));
dostaję błędy:
~/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)’
i
~/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>)}’
i
~/CGAL-4.1/include/CGAL/Implicit_surface_3.h:34:9: note:
candidate expects 1 argument, 2 provided
[aktualizacji]
to jest oczywiste, że w potrzebne do funkcji, która może być przekształcona w funkcji wskaźnika (tj surface
wymagany argument wskaźnika funkcji). To wyklucza opcję std::bind
. Ponadto wydaje się, że lambda nie może zostać przekonwertowana na wskaźnik funkcji, jeśli przechwytuje zmienne (capture-less vs. capturing lambdas). Więc myślę, że odpowiedź Andy-Prowl'a poniżej jest ogólnie poprawną odpowiedzią na to pytanie, chociaż muszę znaleźć inne podejście do pracy.
(I naprawdę nie przeczytać pytanie) wiążą lub lambda? –
Znaczniki wprowadzają w błąd, powinny zawierać matlab/lambda – Dmitry
Czy któreś z tych rozwiązań rzeczywiście działa? Czy nie można użyć binda, aby stać się wskaźnikiem funkcji? –