Funksiya shabloniga misol
#include
using namespace std;
// Funksiya shabloni e’lon qilinishi...
template void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int i=10, j=20;
double x=10.1, y=23.3;
char a='x', b='z';
cout << "Original i, j: " << i << ' ' << j << '\n';
cout << "Original x, y: " << x << ' ' << y << '\n';
cout << "Original a, b: " << a << ' ' << b << '\n';
swapargs(i, j); // swap funksiyasi butun toifa uchun (int)
swapargs(x, y); // swap funksiyasi haqiqiy toifa uchun (float)
swapargs(a, b); // swap funksiyasi simvol toifa uchun (char)
cout << "Swapped i, j: " << i << ' ' << j << '\n';
cout << "Swapped x, y: " << x << ' ' << y << '\n';
cout << "Swapped a, b: " << a << ' ' << b << '\n';
return 0;
}
Dastur izohi:
Umumiy funksiyaning boshqacha ko’rinishi
Quyidagi misolda swapargs( ) funksiyasi boshqacharoq ko’rinishda e’lon qilingan. Ya’ni shablon birinchi satrda funksiya esa alohida satrda joylashgan.
template
void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}
Lekin bu ko’rinishda birinchi va ikkinchi satr o’rniga bironta kod yozilsa xatolik beradi
template
int c // ERROR
void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}
Funksiya shablonini override (qayta yozish) qilish.
template void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
cout << "swapargs funksiya shabloni chaqirildi.\n";
}
// Bunda swapargs() funksiyasi faqatgina int tipi uchun ishlaydi.
void swapargs(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
cout << " int tipi uchun maxsus swapargs funksiyasi.\n";
}
int main()
{
int i=10, j=20;
double x=10.1, y=23.3;
char a='x', b='z';
cout << "Original i, j: " << i << ' ' << j << '\n';
cout << "Original x, y: " << x << ' ' << y << '\n';
cout << "Original a, b: " << a << ' ' << b << '\n';
swapargs(i, j); // calls explicitly overloaded swapargs()
swapargs(x, y); // calls generic swapargs()
swapargs(a, b); // calls generic swapargs()
cout << "Swapped i, j: " << i << ' ' << j << '\n';
cout << "Swapped x, y: " << x << ' ' << y << '\n';
cout << "Swapped a, b: " << a << ' ' << b << '\n';
return 0;
}
Dastur natijasi:
Original i, j: 10 20
Original x, y: 10.1 23.3
Original a, b: x z
int tipi uchun maxsus swapargs funksiyasi.
swapargs funksiya shabloni chaqirildi.
swapargs funksiya shabloni chaqirildi.
Swapped i, j: 20 10
Swapped x, y: 23.3 10.1
Swapped a, b: z x
Funksiya shablonini Override qilish yangi usuli
template<> void swapargs(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
cout << " int tipi uchun maxsus swapargs funksiyasi.\n";
}
Funksiya shablonini overload qilish.
// Oddiy funksiyalardek, funksiya shablonini ham overload qilish mumkin.
#include
using namespace std;
// f() funksiya shablonining birinchi turi.
template void f(X a)
{
cout << "Inside f(X a)\n";
}
// f() funksiya shablonining ikkinchi turi.
template void f(X a, Y b)
{
cout << "Inside f(X a, Y b)\n";
}
int main()
{
f(10); // calls f(X)
f(10, 20); // calls f(X, Y)
return 0;
}
Funksiya shablonining kamchiligi
Umumiy funksiyalar funksiya overloadining o’rnini bosishi mumkin.
Lekin bu yerda bitta kamchilik mavjud.
Biz oddiy funksiyani overload qilganimizda, har xil ma’lumotlar tipi uchun funksiya tanasini har xil qilib yozishimiz mumkin.
Lekin umumiy funksiyada har xil tip qabul qila olgani bilan funksiya tanasi har doim bir xil bo’ladi, chunki bitta funksiyaga murojaat bo’ladi.
Faqatgina ma’lumotlar tipi har xil bo’la oladi.
Umumiy sinflar (sinf shabloni)
Sinf shablonini e’lon qilishning umumiy formasi:
template TOIFA> class sinf_nomi{
...
}
Yoki quyidagi ko’rinishda e’lon qilish mumkin
template TOIFA>
class sinf_nomi {
...
}
Sinf shablonini ishlatish
sinf_nomi obyekt;
Sinf shabloni uchun oddiy misol.
#include
using namespace std;
template
class mypair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T getmax ();
};
template
T mypair::getmax (){
T retval;
retval = a>b? a : b;
return retval;
}
int main () {
mypair myobject (100, 75);
cout << myobject.getmax();
return 0;
}
Sinf shablonida ikki xil toifadan foydalanish
#include
using namespace std;
template class myclass {
Type1 i;
Type2 j;
public:
myclass(Type1 a, Type2 b) { i = a; j = b; }
void show() { cout << i << ' ' << j << '\n'; }
};
int main()
{
myclass ob1(10, 0.23);
myclass ob2('X', "Templates add power.");
ob1.show(); // show int, double
ob2.show(); // show char, char *
return 0;
}
Dastur natijasi:
10 0.23
X Templates add power.
Maxsuslashtirilgan sinf shabloni
template<> konstruktori maxsusashtirilgan sinf shabloni uchun ishlatiladi
template class myclass {
T x;
public:
myclass(T a) {
cout << "Inside generic myclass\n";
x = a;
}
T getx() { return x; }
};
// int toifasi uchun maxsuslashtirilgan sinf shabloni.
template <> class myclass {
int x;
public:
myclass(int a) {
cout << "Inside myclass specialization\n";
x = a * a;
}
int getx() { return x; }
};
Shablonning asosiy xususiyatlari
reusable kod yozish imkonini beradi.
Shablonlar yordamida framework lar yaratish mumkin
Dastur kodi egiluvchanlik xususiyatiga ega bo’ladi.
Turli xil tipdagi ma’lumotlar ustida ishlash uchun kod yozishda vaqtni tejash
STL komponentalari. C++ dagi STL lar (Standard Shablon Kutubxonalar), nomidan ko’rinib turibdiki, shablonlar yordamida yaratilgan.
STL tarkibi
Biblioteka yadrosi uchta elementdan iborat: konteynerlar, algoritmlar va iteratorlar.
Konteynerlar (containers) – bu boshqa elementlarni saqlovchi ob’ektlar. Masalan, vektor, chiziqli ro‘yxat, to‘plam.
Dostları ilə paylaş: |