من از یه جای دیگه شروع میکنم به جواب:
سادهترین راه
#include <iostream>
using namespace std;
void f(int (*cb)(int), int x)
{
cout<<cb(x);
}
void f(int (*cb)(int, int), int x, int y)
{
cout<<cb(x, y);
}
void f(int (*cb)(float x, int y), float x, int y)
{
cout<<cb(x, y);
}
int g1(int x)
{
return x;
}
int g2(int x, int y)
{
return x+y;
}
int g3(float x, int y)
{
return (int)(x-y);
}
int main(void)
{
f(&g1, 10);
f(&g2, 10, 20);
f(&g3, 10.5, 20);
return 0;
}
یه کم میشه پیشرفتهترش کرد
#include <iostream>
using namespace std;
void f(int (*cb)(int, int), int x, int y=0)
{
cout<<cb(x, y);
}
void f(int (*cb)(float x, int y), float x, int y)
{
cout<<cb(x, y);
}
int g1(int x, int y=0)
{
return x*y;
}
int g2(float x, int y)
{
return (int)(x+y);
}
int main(void)
{
f(&g1, 10);
f(&g1, 10, 20);
f(&g2, 10.5, 20);
return 0;
}
حالت بعدی کمی قشنگتره ولی یه اشکال جزئی داره که میتونه با یه داده float
هم اجرا بشه که خب مساله این و نخواسته از ما
#include <iostream>
using namespace std;
template <class T>
void f(int (*cb)(T, int), T x, int y=0)
{
cout<<cb(x, y);
}
int g1(int x, int y)
{
return x*y;
}
int g2(float x, int y)
{
return (int)(x+y);
}
int main(void)
{
f(&g1, 10);
f(&g1, 10, 20);
f(&g2, (float)10.5, 20);
return 0;
}
تا الان که استفادهای از void*
نشده. اما حالا میخوایم با اون هم کار کنیم. البته یه مشکلی اینجا وجود داره اون هم این که اگه منظور از اشارهگر پوچ برای استفاده به شکل int f(void *cb(int, int)
و دو حالت دیگه هست، خب باید اون مقادیر ارسالی هم به صورت void*
باشه که بشه درست استفاده کرد ازش
int f(void (*cb)(void*, void*), void*, void*);
این درسته. اما غیر این به نظرم نشه کاری با void*
فقط به عنوان نوع بازگشتی f
انجام داد.
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)