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

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

استفاده از اشاره‌گر پوچ برای توابع callback

+2 امتیاز
384 نمایش

من می‌خوام یه اشاره‌گر داشته باشم که بتونه به ۳ تا تابع با امضاهای زیر اشاره کنه و تابع‌ها رو به با اون اشاره‌گر عنوان callback فراخوانی کنم.


int f(int, int);
int g(int);
int h(float);

اشاره گر پوچ برای کاری که می‌خوام مناسبه؟ می‌شه همچی استفاده‌ای ازش کرد؟
برنامه‌ای که تست نشده کار نخواهد کرد (Stroustrup, Bjarne)
پرسیده شده دوشنبه ۱۳ آذر ۱۳۹۱ در C++ توسط CPP_Crawler3  
بازتگ شده جمعه ۲۳ فروردین ۱۳۹۲ توسط admin

1 پاسخ

0 امتیاز

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

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

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده پنجشنبه ۲۹ فروردین ۱۳۹۲ توسط prodo  
ویرایش شده پنجشنبه ۲۹ فروردین ۱۳۹۲ توسط prodo