رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

برنامه نویسی

  • نوشته‌
    21
  • دیدگاه
    14
  • مشاهده
    2,910

مشارکت‌کنندگان این وبلاگ

شبیه سازی تکنیک Template در زبان C

با سلام 

در یکی از پروژه ها که با زبان C توسعه داده شده، به شدت نیاز به تکنیک های Template زبان ++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 شده یک آبجکت جدید بسازید.

توجه داشته باشید که در این روش متاسفانه خوانایی کد کم شده است آنهم به علت استفاده از ماکروها ، ولی خاصیت Reusability بیشتری خواهید داشت.

  • پسندیدن 1
  • تشکر شده 2


2 دیدگاه


نظرهای پیشنهاد شده

درود بر شما؛  

همچنین برای بهره‌وری بهتر درصورتی‌که کامپایلر GCC یا Clang را دارید، می‌توانید از قابلیّت «Braced-groups Within Expressions» استفاده و حالتی را شبیه به توابع Lambda را پیاده‌سازی کنید :

#define lambda(x) ({x})
int main ()
{
    printf("%d\n", lambda(
                int i = 0;
                printf("%d\n", i);
                i = 10;
                ));
    return 0;
}

 

به اشتراک گذاری این دیدگاه


لینک به دیدگاه
در 6 ساعت قبل، قاسم رمضانی منش گفته است :

درود بر شما؛  

همچنین برای بهره‌وری بهتر درصورتی‌که کامپایلر GCC یا Clang را دارید، می‌توانید از قابلیّت «Braced-groups Within Expressions» استفاده و حالتی را شبیه به توابع Lambda را پیاده‌سازی کنید :


#define lambda(x) ({x})
int main ()
{
    printf("%d\n", lambda(
                int i = 0;
                printf("%d\n", i);
                i = 10;
                ));
    return 0;
}

 

احسنت! 

البته بیشتر به یک inner block شبیه هست تا عبارتهای لامبدا! 

چه کاربردی برای شما داشته ؟ نمونه کدی اگر باشه که عالی! به هرحال تشکر جناب رمضانی منش گرامی!

به اشتراک گذاری این دیدگاه


لینک به دیدگاه
مهمان
افزودن دیدگاه

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...