Przekazanie wskaźnika do funkcji wraz z argumentami

0

Witam.
Czy w C++ jest możliwe przekazanie wskaźnika do funkcji wraz z argumentami?

bool Function_01(){
	return true;
}
bool Funtion_02(int X)
{
	return X % 2 == 0;
}
bool Funtion_03(int X, double C)
{
	return X / C > 1;
}

//Pseudocode
bool Check(? Pointer to funtion with parameters, ? Parameters, ...) //? 
bool Is_Correct_01 = Check(&Funtion_01);
bool Is_Correct_02 = Check(&Funtion_02, 15)
bool Is_Correct_03 = Check(&Funtion_03, 15, 4.5)

Pierwszy pomysł jaki mi przychodzi to stworzenie szablonu funkcji przyjmującej wskaźnik do funkcji i parametry jako void *, jednak wtedy następna funkcji też musiałby przyjmować parametry jako void *, ..., co byłoby dosyć kłopotliwe przy próbie wywołania funkcji w sposób bezpośredni.

template <class T> Check (T Pointer_To_Function, void * Parameters, ...)

Drugi pomysł to coś na wzór poniższego kodu:

template<class T, ...> bool Check(T Arg, ...)

Z tym że w przypadku drugiego kodu nie wiem czy jest możliwe zrobienie aby każdy Arg miał typ określony kolejnymi T.

4

Jeżeli możesz korzystać z w miarę nowoczesnego C++ to np. tak:

template <class ...Ts>
bool check(bool (*func)(Ts...), Ts... args)
{
	return func(args...);
}
0

Dokładnie czegoś takiego szukałem.
Dziękuję za pomoc.

0

Jednak jest problem, przy próbie kompilacji otrzymują poniższe błędy:

Error	1	error C2332: 'class' : missing tag name	
Error	2	error C2993: '' : illegal type for non-type template parameter '<unnamed-tag>'	
Error	3	error C2143: syntax error : missing ',' before '...'	
Error	4	error C2065: 'func' : undeclared identifier	
Error	5	error C2065: 'Ts' : undeclared identifier	
Error	6	error C2143: syntax error : missing ')' before '...'	
Error	7	error C2059: syntax error : ')'
Error	8	error C2143: syntax error : missing ';' before '{'	
Error	9	error C2447: '{' : missing function header (old-style formal list?)	

Na początku sprawdziłem kod na ideone i działał bez żadnych problemów, jednak przy próbie kompilacji w Visual Studio Express 2012 For Windows Descop pojawiają się błędy. Z tego co wiem to niektóre rzeczy z C++11 oraz C++14 nie działają w Visualu. Czy w nowszej wersji ten problem nadal występuje?

2

Od czasów VS2012 pojawiły się dwie nowe wersje. Ściągnij sobie VS2015 Community: https://www.visualstudio.com/downloads/download-visual-studio-vs

0

Zainstalowałem, wszystko ładnie działa.
Dziękuję za pomoc.

0

Czy jest możliwe wywołanie funkcji posiadającej domyślne argumenty bez potrzeby ich przekazywania?

bool Function_01(int x = 0)
{
	return false;
}

template <class T, class ...FuncTs, class ...Ts>T check(T(*func)(FuncTs...), Ts... args)
{
	return func(args...);
}
auto Value_01 = check(&Function_01, 15);
auto Value_02 = check(&Function_01); //Error
1

Nie wydaje mi się, żeby to było możliwe. Domyślne wartości argumentów nie są do końca "first-class citizen" i są średnio kompatybilne z tego typu ficzerami.

0

W jaki sposób przekazać funkcję będącą publiczną metodą klasy?

template <class T, class ...Ts>T check(T(*func)(Ts...), Ts... args)
{
	return func(args...);
}

bool Check_00(HWND Target = NULL, bool Create_Screen = true, int Add_X = 0, int Add_Y = 0)
{
	return true;
}

Color.h

bool Check_Color_Special_00(HWND Target = NULL, bool Create_Screen = true, int Add_X = 0, int Add_Y = 0);
Color color;

auto Value_01 = color.Check_Color_Special_00((HWND)NULL, true, 0, 0);
auto Value_02 = check(&Check_00, (HWND)NULL, true, 0, 0);
auto Value_03 = check(&color.Check_Color_Special_00, (HWND)NULL, true, 0, 0); //Error
1

Proponuje zainteresować się lambdami (C++11) lub obiektami funkcyjnymi (C++98).

Poradnik:
http://www.cprogramming.com/c++11/c++11-lambda-closures.html

2

Po pierwsze wtf! Użyj std::function zamiast się bawić ze swoimi "rozwiązaniami" (zwłaszcza kiedy widać, że nie rozumiesz co robisz).

Kamil9132 napisał(a):

Czy jest możliwe wywołanie funkcji posiadającej domyślne argumenty bez potrzeby ich przekazywania?

Nie. Domyślne parametry nie są częścią typu funkcji. Mógłbyś za to przekazać te domyślne parametry przez obiekt funkcyjny/bind/lambdę.

Kamil9132 napisał(a):

W jaki sposób przekazać funkcję będącą publiczną metodą klasy?

Wiesz w ogóle co to wskaźnik do funkcji? Co to wskaźnik na metodę? Czym to się różni? Nie wiesz? Użyj std::function. Wiesz? Także użyj std::function (chyba, że masz poważny powód żeby tak nie robić).

0

Do przekazywania funkcji przyzwyczaiłem się z C#, gdzie wystarczyło proste delegate, po powrocie do C++ zapomniałem o tym że jest różnica pomiędzy wskaźnikiem do funkcji, a wskaźnikiem na metodę. Trochę poszukałem i wyszedł mi poniższy kod:

template <class T> bool Check(T Func)
{
	return Func();
}
Color color;
auto Value = Check(std::bind(&Color::Check_Color_Special_00, color, (HWND)NULL, true, 0, 0));
1

Color color;
auto Value = Check(std::bind(&Color::Check_Color_Special_00, color, (HWND)NULL, true, 0, 0));

Jak już tak napisałeś, to mogłeś po prostu:

Color color;
bool Value = color.Check_Color_Special_00((HWND)NULL, true, 0, 0);

;-)

0

Funkcja Check będzie bardziej rozbudowana, teraz wygląda tak tylko po to aby sprawdzić czy kod działa poprawnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1