در زبان برنامه نویسی سی پلاس پلاس، Event یک عضو از کلاس است که به یک شی اجازه اطلاع رسانی هنگام رخ دادن اتفاق خاص را می دهد، و علمیات اطلاع رسانی یا سیگنالینگ شامل یک Delegate (نماینده) می شود که امکان عکس العمل به Event را فراهم می آورد. برای مثال یک کلیک موس یک event به حساب می آید و شیئی که از این event سرچشمه می گیرد می تواند با فراخوانی یک یا چند تابع، رخ دادن این event را اطلاع رسانی کند؛ یک delegate میتواند ابزار دسترسی به توابعی که مسئول این event هستند را ارائه کند. 
ایده delegate بسیار ساده است - یک شی که یک یا چند اشاره گر به تابعی که دارای یک لیست پارامتر و نوع خروجی است، را در بر می گیرد. این تابع که delegate به آن اشاره می کند، Event را مدیریت می کند. پس delegate در C++/CLI تقریبا عملکرد مشابهی نسبت به "اشاره گر به تابع" در C++ استاندراد دارد.

تعریف delegate :

تعریف delegate ، مشابه تعریف تابع است که در ابتدای آن از کلمه delegate استفاده شده باشد. اما در اصل دو چیز در آن تعریف می شود: نام نوع ارجاع برای شی delegate و لیست پارامتر ها و نوع خروجی تابعی که می تواند همراه با delegate به کار رود. نوع ارجاع یک delegate ، کلاس System::Delegate را به عنوان کلاس پایه در اختیار دارد، پس همیشه از این کلاس مشتق خواهد شد. در زیر نمونه ای از تعریف delegate آمده است.

public delegate void HANDLER(int value);

این خط یک HANDLER از نوع ارجاع delegate تعریف می کند که نوعش از System::Delegate مشتق شده است و یک شی از آن می تواند حاوی اشاره گری به یک یا چند تابع با یک پارامتر ورودی int و نوع خروجی void (بدون نوع خروجی) داشته باشد. تابعی که delegate به آن اشاره می کند میتواند Static یا Instance باشد.

ایجاد delegate :

حالا که delegate را تعریف کردیم میتوانیم اشیاء delegate از این نوع ایجاد کنیم. ما میتوانیم دو تابع سازنده داشته باشیم که اولی، یک و دیگری، دو پارامتر را می پذیرد. پارامتری که برای سازنده delegate با یک پارامتر استفاده می شود باید یک تابع static عضو کلاس یا یک تابع عمومی باشد. تابعی که به عنوان پارامتر تعریف می کنید باید دارای پارامتر ها و نوع خروجی یکسان با انواع تعریف شده در delegate باشد. برای مثال کلاس زیر را در نظر بگیرید.


class HandlerClass
{public:
static void Sample(int num)
{
  Console::WriteLine(L"Function called with value {0}", num);
}

};

تابع Sample از کلاس بالا را به عنوان تابع مدیریت کننده ی Event به کار می بریم. این تابع دارای یک پارامتر ار نوع int و نوع خروجی void است درست مانند آنچه در delegate تعریف کرده ایم. البته نیازی نیست این تابع در کلاس باشد و هر تابعی متواند این مسئولیت را قبول کند. در زیر از این تابع برای ایجاد delegate استفاده می کنیم.


HANDLER^ handler = gcnew HANDLER (HandlerClass::Sample);


شی handler ، آدرس تابع استاتیک Sample در کلاس HandlerClass را در بردارد. اگر شما delegate را فراخوانی کنید، این تابع را فراخوانی کرده اید. این فراخوانی را می توان به صورت زیر انجام داد.


handler - > Invoke("parameter");

یا به صورت  :

handler ("parameter");

این دستور باعث فراخوانی توابعی می شود که در لیست فراخوانی delegate قرار دارند که در این مثال تنها تابع Sample می باشد. پس خروجی به صورت زیر خواهد بود. (فرض کنید مقدار 100 را به عنوان پارامتر به delegate ارسال کرده ایم)


(عبارت زیر در خروجی چاپ می شود)
Function called with value 100

در پست های بعدی به سراغ ادامه ی بحث delegate در C++ می رویم.
   style=