Wskaźnik do funkcji z dwoma parametrami?

0

Cześć, siedzę nad tym kolejne godziny i nie potrafię sobie poradzić..
Otóż, mam do zrobienia szablon metody której argumentem będzie m.in. wskaźnik do metody z dwoma parametrami (typ z template).
Sprawa wygląda tak, mam przygotowane dwie metody i ma się wykonać ta, do której użyję wskaźnika. Obie zwracają bool i jeśli będzie true to główna metoda ma coś zrobić a jeśli false to co innego.

Moje pytanie brzmi, jak mogę dodać do argumentu wskaźnik do innej metody podając z góry moje dwa argumenty?
Czyli przykładowo, teoretycznie wyglądać powinno tak:

int metoda(..., metoda2(1, 3) );

// wtedy powinna wykonać się metoda2 i jeśli true to metoda robi coś a jeśli false to co innego

lub

int metoda(..., metoda3(1, 3) );

// wtedy powinna wykonać się metoda3 i jeśli true to metoda robi coś a jeśli false to co innego

Niestety nie potrafię tego przełożyć na język programistyczny, czy mógłby ktoś podpowiedzieć choć trochę?

Spotkałem się z czymś takim:

int *fun(int)

Jest to podobno wskaźnik do metody zwracającej int tylko jak coś takiego dopisać do parametru innej metody? Co zrobić aby została ona na początku wykonana i od niej zależało działanie metody, której jest argumentem?

Jeśli zbyt zamotałem to proszę mówcie a ja postaram się wyjaśnić na ile będę w stanie.

1

To co pokazujesz to przekazanie wyniku funkcji metoda2 lub metoda3 jako parametru metoda.

int* fun(int)

to pod żadnym pozorem nie jest wskaźnik na funkcję, tylko deklaracja funkcji fun przyjmującej int i zwracającej wskaźnik na int.

Przykład funkcji przyjmującej wskaźnik na funkcję + przykłady użycia: http://en.cppreference.com/w/c/algorithm/qsort

0

Dziękuję za odpowiedź.
Możliwe, że te wskaźniki są dla mnie zbyt trudne do zrozumienia ale w jaki sposób miałbym podać argumenty do wybranej metody?

Rozumiem, że wywołanie w mainie wyglądałoby tak:

metoda(..., metoda1);

A moja główna metoda:

int metoda(..., bool (*metoda1)(const T *, const T *));

Podmieniłem na "T" ze względu na wymagania zadania, typy argumentów metod bool mają być takie jak w szablonie metody.

0

Metoda do której przekazujesz wskaźnik wywołuje funkcję (czyli też podaje argumenty), a nie Ty. Tak poza tym - dobrze.

2
bool test (int, double) { return true; }

template <typename T1, typename T2>
void call (std::function<bool(T1, T2)> func, T1 &&t1, T2 &&t2) {
	if (func(std::forward<T1>(t1), std::forward<T2>(t2))) {
		std::cout << "true";
	} else {
		std::cout << "false";
	}
}

int main () {
	call<int, double>(test, 1, 1.1);
}
bool test (int, double) { return true; }

template <typename func_t, typename ... args_t>
void call (func_t func, args_t &&... args) {
	static_assert(std::is_same<bool, typename std::decay_t<std::result_of_t<func_t(args_t...)>>>::value, "nope");
	if (func(std::forward<args_t>(args)...)) {
		std::cout << "true";
	} else {
		std::cout << "false";
	}
}

int main () {
	call(test, 1, 1.1);
}
  1. wykorzystująca sfinae sugestia od @kq, coby nie podaać explicite template arguments
template <typename T>
struct helper { using type = T; };

template <typename T>
using helper_t = typename helper<T>::type;

template <typename T1, typename T2>
void call (helper_t<std::function<bool (T1, T2)>> func, T1 &&t1, T2 &&t2) {
	if (func(std::forward<T1>(t1), std::forward<T2>(t2))) {
		std::cout << "true";
	} else {
		std::cout << "false";
	}
}

bool test (int, double) { return true; }

int main () {
	call(test, 1, 1.1);
}
0

Ahh, rozumiem, tyle, że w jaki sposób w mojej głównej metodzie mam powiedzieć do której metody ma to być wskaźnik? Bo gdy jest jedna metoda to wiadomo, zrobić dwa możliwe szablony, jeden gdy ktoś wybierze metoda1 a drugi gdy ktoś wybierze metoda2?
Nie chcę pisać pytania na post więc jeszcze spytam, jak mogę "podpiąć" moje metody bool do szablonu? W zadaniu mam powiedziane, że argumenty we wskaźniku mają być typu co w szablonie więc i w metodzie bool powinny być identyczne ale IDE nie pozwala na coś takiego abym we wskaźniku dał "T" oraz w oddzielnej metodzie bool jako argument typ "T".

1

Podaj dwa wskaźniki na funkcje i niech sobie funkcja docelowa wybiera którą zawołać.

1

Ponieważ w C/C++ wskaźniki na funkcje są super nieczytelne zawsze używaj using (albo typedef). Tzn:

using Function = int (int);
using FunctionPtr = Function *;
 
int function(int x) {
  return 2*x;	
}
 
void callFunction(FunctionPtr f, int x) {
  std::cout << (*f)(x) << std::endl;
}
 
int main() {
  FunctionPtr f = &function;
  callFunction(f, 2);
}

http://ideone.com/mqjWG0

0

Przepraszam, teraz to ja już kompletnie nic nie rozumiem. Czy moglibyście polecić jakieś strony gdzie zrozumiem działanie tych wskaźników na funkcje?
Wraz z kolejnymi postami coraz gorzej mi to przychodzi a chciałbym zrozumieć.

1
using func = double(*)(double);

double call(bool call_first, func first, func second)
{
	double param = 22./7;
	return call_first ? first(param) : second(param);
}

auto main() -> int
{
	DBG(call(true, sin, cos));
	DBG(call(false, sin, cos));
}

Może to Ci coś wyjaśni.
http://melpon.org/wandbox/permlink/XgxGSkOQ87yUtzV1

0

Dziękuję bardzo za pomoc, będę dalej coś próbował sam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.