اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

تاریخچه‌ی ویرایش برای ارسال #1258

پنجشنبه ۲۹ فروردین ۱۳۹۲ ارسال شده توسط prodo

من از یه جای دیگه شروع می‌کنم به جواب:
ساده‌ترین راه

#include
using namespace std;

void f(int (*cb)(int), int x)
{
cout< }
void f(int (*cb)(int, int), int x, int y)
{
cout< }
void f(int (*cb)(float x, int y), float x, int y)
{
cout< }

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
using namespace std;

void f(int (*cb)(int, int), int x, int y=0)
{
cout< }
void f(int (*cb)(float x, int y), float x, int y)
{
cout< }

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
using namespace std;

template
void f(int (*cb)(T, int), T x, int y=0)
{
cout< }

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*` نشده. اما حالا می‌خوایم با اون هم کار کنیم
پنجشنبه ۲۹ فروردین ۱۳۹۲ ویرایش شده توسط prodo

من از یه جای دیگه شروع می‌کنم به جواب:
ساده‌ترین راه

#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` انجام داد.