متدهای عمومی

اگر بخواهید چندین متد با عملکرد مشابه ایجاد کنید و فقط تفاوت آنها در نوع داده‌ای باشد که قبول می‌کنند (مثلاً یکی نوع int و دیگری نوع double را قبول کند) می‌توان از متدهای عمومی برای صرفه جویی در کدنویسی استفاده کرد. ساختار عمومی یک متد عمومی به شکل زیر است :

template<class Type, ...>
return-type function-name(Type arg1, ...)
{
    //Body of function template
}

مشاهده می‌کنید که بعد از نام متد یک نوع در داخل دو علامت بزرگتر و کوچکتر آمده است ( <type> ) که همه انواع در ++C می‌توانند جایگزین آن شوند. برنامه زیر مثالی از نحوه استفاده از متد عمومی می‌باشد :

#include <string>
#include <iostream>
using namespace std;

template<class E> 
void Show(E item)
{
    cout << item << endl;
}

int main()
{
    int    intValue = 5;
    double doubleValue = 10.54;
    string stringValue = "Hello";
    bool   boolValue = true;

    Show(intValue);
    Show(doubleValue);
    Show(stringValue);
    Show(boolValue);
}
5
10.54
Hello
1

یک متد جنریک ایجاد کرده‌ایم که هر نوع داده‌ای را قبول کرده و مقادیر آنها را نمایش می‌دهد (خطوط 9-5). سپس داده‌های مختلفی با وظایف یکسان به آن ارسال می‌کنیم. متد نیز نوع E را بسته به نوع داده‌ای که به عنوان آرگومان ارسال شده است تغییر می‌دهد. همچنین هنگام فراخوانی متد جنریک صریحاً می‌توانید نوعی را که به وسیله آن مورد استفاده قرار می‌گیرد ذکر کنید (البته لازم نیست). به عنوان مثال فراخوانی‌های متد بالا را می‌توان به صورت زیر هم نوشت :

Show<int>(intValue);
Show<double>(doubleValue);
Show<string>(stringValue);
Show<bool>(boolValue);

به یک نکته در مورد استفاده از متدهای جنریک توجه کنید و آن این است که، شما می‌توانید در داخل کدهای مربوط به متد محاسبات انجام دهید، مثلاً دو عدد را با هم جمع کنید ولی باید مراقب باشید که نوع اعداد با هم یکی باشد، مثلا هر دو int و یا double باشند:

#include <string>
#include <iostream>
using namespace std;

template<class E> 
void Show(E x, E y)
{
    cout << x + y << endl;
}

int main()
{
    Show(10, 5);

    Show(1.5, 1.0);
}
15
2.5

شما می‌توانید چندین نوع خاص را برای متد جنریک ارسال کنید، برای این کار هر نوع را به وسیله کاما از دیگری جدا کنید.

template<class E, class C> 
void Show(E x, C y)
{
    cout << x << endl;
    cout << y << endl;
}

به مثال زیر که در آن دو مقدار مختلف به متد ارسال شده است توجه کنید :

Show(5, true);

// OR

Show<int, bool>(5, true);

مشاهده می‌کنید که X با نوع int و Y با نوع bool جایگزین می‌شود. این نکته را نیز یادآور شویم که شما می‌توانید دو آرگومان هم نوع را هم به متد ارسال کنید :

Show(5, 10);

// OR

Show<int, int>(5, true);