با سلام
در یکی از پروژه ها که با زبان C توسعه داده شده، به شدت نیاز به تکنیک های Template زبان ++C داشتیم تا از چند ریختی در زمان اجرا نهایت استفاده را ببریم ولی خوب متاسفانه زبان C چنین تکنیکی را به صورت مستقیم پیش بینی نکرده لذا به فکر افتادم که با استفاده از تکنیک های ماکروها که در زبان C بسیار قدرتمند هستند برنامه ای به شکل زیر بنویسم امیدوارم مفید فایده واقع شود.
استفاده از Macro Concatenation و Function Pointer شبیه سازی یک کلاس Template در زبان C
البته که ما در این کد چند ریختی در زمان اجرا را نخواهیم داشت ولی چندریختی در زمان کامپایل و البته کدنویسی کمتر و تکرار کد کمتر را خواهیم داشت، بنابراین میتوانیم برنامه هایی که مینویسم هم قابلیت استفاده مجدد بالایی داشته باشند.
#include <stdio.h>
#include <stdbool.h>
#define point(T) point_##T
#define DEFINE_POINT(T) struct point(T) {\
T x;\
T y;\
};\
bool point_##T##_any(struct point(T) point , bool(*predicate)(T)) {\
return predicate(point.x) || predicate(point.y);\
}\
bool is_##T##_positive(T p) {\
return p < 0;\
}\
typedef struct point(T) point##T;
#define any(T) point_##T##_any
DEFINE_POINT(float)
DEFINE_POINT(int)
int main()
{
pointfloat pfloat;
pfloat.x = 1.1;
pfloat.y = -1.2;
printf("%d\n" , any(float)(pfloat , is_float_positive) );
pointint pInt;
pInt.x = 1;
pInt.y = -1;
printf("%d\n" , any(int)(pInt , is_int_positive) );
return 0;
}
بنابراین به سادگی کافی است نوع هایی که لازم هست را با استفاده از DEFINE_POINT تعریف کنید، و بعد برای استفاده به این صورت (point+Type name) از روی استراکچر Define شده یک آبجکت جدید بسازید.
توجه داشته باشید که در این روش متاسفانه خوانایی کد کم شده است آنهم به علت استفاده از ماکروها ، ولی قطعا Re-usability بیشتری در کدنویسی نصیبتان خواهد شد.