C++ এ Template Specialization এবং Partial Specialization এমন বৈশিষ্ট্য যা templates এর ক্ষেত্রে custom behavior (বিশেষ আচরণ) নির্দিষ্ট করতে ব্যবহার করা হয়। Templates একটি সাধারণ কোড ডিজাইন প্যাটার্ন, যেখানে আপনি একটি ফাংশন বা ক্লাসের জন্য সাধারণ কোড লিখে, তার পরামিতি টাইপের ভিত্তিতে সেই কোডের আচরণ পরিবর্তন করতে পারেন। তবে, কখনও কখনও আপনার প্রয়োজন হতে পারে কিছু বিশেষ পরিস্থিতিতে টেমপ্লেটের আচরণ পরিবর্তন করার, এটি করতে Template Specialization এবং Partial Specialization ব্যবহার করা হয়।
১. Template Specialization
Template Specialization হল একটি প্রক্রিয়া যেখানে আপনি একটি সাধারণ টেমপ্লেটের জন্য বিশেষ আচরণ নির্ধারণ করতে পারেন নির্দিষ্ট টাইপের জন্য। এটি তখন ব্যবহার করা হয় যখন একটি টেমপ্লেটের জন্য আপনি একটি নির্দিষ্ট ইনপুট টাইপের জন্য আলাদা আচরণ চাচ্ছেন।
Full Specialization
ফুল স্পেশালাইজেশনের মধ্যে, আপনি একটি নির্দিষ্ট টেমপ্লেট ইন্সট্যানশিয়েশন (specialization) তৈরি করেন। এর মাধ্যমে আপনি টেমপ্লেটের একটি নির্দিষ্ট ধরনের জন্য আলাদা কোড লিখতে পারেন।
উদাহরণ: Template Specialization (Full Specialization)
#include <iostream>
using namespace std;
// সাধারণ টেমপ্লেট
template <typename T>
void print(T value) {
cout << "General Template: " << value << endl;
}
// ফুল স্পেশালাইজেশন (int টাইপের জন্য)
template <>
void print<int>(int value) {
cout << "Specialized Template for int: " << value << endl;
}
int main() {
print(5); // Specialized template for int
print(3.14); // General template for double
return 0;
}আউটপুট:
Specialized Template for int: 5
General Template: 3.14এখানে, print<int> এর জন্য একটি ফুল স্পেশালাইজেশন তৈরি করা হয়েছে, যা int টাইপের জন্য আলাদা আচরণ প্রদর্শন করছে, এবং অন্যসব টাইপের জন্য সাধারণ টেমপ্লেট কাজ করছে।
২. Partial Specialization
Partial Specialization হল যখন আপনি একটি টেমপ্লেটের জন্য কিছু প্যারামিটার স্পেশালাইজ করেন, কিন্তু সব প্যারামিটার নয়। এর মাধ্যমে আপনি কিছু অংশে স্পেশালাইজেশন প্রদান করতে পারেন, কিন্তু পুরো প্যারামিটার সেটের জন্য নয়।
উদাহরণ: Template Partial Specialization
#include <iostream>
using namespace std;
// সাধারণ টেমপ্লেট
template <typename T, typename U>
void print(T value1, U value2) {
cout << "General Template: " << value1 << ", " << value2 << endl;
}
// পার্সিয়াল স্পেশালাইজেশন (যখন প্রথম টাইপ int হয়)
template <typename U>
void print<int, U>(int value1, U value2) {
cout << "Partial Specialization for int: " << value1 << ", " << value2 << endl;
}
int main() {
print(5, 3.14); // Partial specialization for int and double
print("Hello", 10); // General template for string and int
return 0;
}আউটপুট:
Partial Specialization for int: 5, 3.14
General Template: Hello, 10এখানে, print<int, U> এর জন্য partial specialization করা হয়েছে, যেখানে প্রথম প্যারামিটার int এবং দ্বিতীয় প্যারামিটার U যেকোনো ধরনের হতে পারে।
৩. Template Specialization vs Partial Specialization
- Full Specialization: এখানে আপনি টেমপ্লেটের সব প্যারামিটার স্পেশালাইজ করেন। এটি শুধুমাত্র একটি নির্দিষ্ট ইনপুট টাইপের জন্য কাজ করে। অন্য টাইপের জন্য সাধারণ টেমপ্লেট ব্যবহৃত হয়।
- Partial Specialization: এখানে কিছু প্যারামিটার স্পেশালাইজ করা হয়, কিন্তু সব প্যারামিটার নয়। এটি আরও নমনীয় এবং সাধারণ ক্ষেত্রে ব্যবহার করা যায়।
তুলনা:
| বিশেষণ | Full Specialization | Partial Specialization |
|---|---|---|
| ব্যবহার | নির্দিষ্ট টাইপের জন্য এক্সিকিউট করা | কিছু প্যারামিটার স্পেশালাইজ করা |
| উদাহরণ | template <> void print<int>(int) | template <typename U> void print<int, U>(int, U) |
| বৈশিষ্ট্য | শুধুমাত্র নির্দিষ্ট টেমপ্লেটের জন্য কাজ করে | কিছু প্যারামিটার কাস্টমাইজ করা যেতে পারে |
| নমনীয়তা | কম নমনীয়, কারণ পুরোপুরি স্পেশালাইজড | বেশি নমনীয়, কিছু প্যারামিটার ছেড়ে দেয় |
৪. Template Specialization এবং Partial Specialization এর প্রয়োগ
- Full Specialization সাধারণত ব্যবহৃত হয় যখন আপনি বিশেষ কিছু ইনপুট টাইপ বা প্যারামিটার এর জন্য সম্পূর্ণ আলাদা আচরণ চান।
- Partial Specialization ব্যবহৃত হয় যখন আপনি একটি সাধারণ আচরণ বজায় রেখে, শুধুমাত্র কিছু প্যারামিটার স্পেশালাইজ করতে চান। এটি সাধারণ টেমপ্লেট কনসেপ্টের জন্য আরও উন্নত এবং নমনীয় সমাধান প্রদান করে।
উদাহরণ: ট্রেডার ক্লাসে স্পেশালাইজেশন (Full and Partial)
#include <iostream>
#include <string>
using namespace std;
// সাধারণ টেমপ্লেট
template <typename T>
class Trader {
public:
void trade(T amount) {
cout << "Trading " << amount << endl;
}
};
// `std::string` এর জন্য ফুল স্পেশালাইজেশন
template <>
class Trader<string> {
public:
void trade(string amount) {
cout << "Trading a string amount: " << amount << endl;
}
};
// পার্সিয়াল স্পেশালাইজেশন (যখন T = int)
template <typename U>
class Trader<int, U> {
public:
void trade(int amount, U asset) {
cout << "Trading " << amount << " units of " << asset << endl;
}
};
int main() {
Trader<int> trader1; // সাধারন টেমপ্লেট
trader1.trade(100); // Trading 100
Trader<string> trader2; // ফুল স্পেশালাইজেশন (string এর জন্য)
trader2.trade("100 USD"); // Trading a string amount: 100 USD
Trader<int, string> trader3; // পার্সিয়াল স্পেশালাইজেশন (int এবং string)
trader3.trade(200, "Stocks"); // Trading 200 units of Stocks
return 0;
}আউটপুট:
Trading 100
Trading a string amount: 100 USD
Trading 200 units of Stocksএখানে, Trader<string> এর জন্য ফুল স্পেশালাইজেশন এবং Trader<int, string> এর জন্য পার্সিয়াল স্পেশালাইজেশন করা হয়েছে।
উপসংহার
- Full Specialization: একটি নির্দিষ্ট টাইপের জন্য টেমপ্লেটের সম্পূর্ণ আচরণ পরিবর্তন করে।
- Partial Specialization: কিছু প্যারামিটার স্পেশালাইজ করা হয়, যা পুরোপুরি কাস্টমাইজ করার জন্য আরও নমনীয় এবং সাধারণ টেমপ্লেট ব্যবহারের অনুমতি দেয়।
- উভয়ই generic programming এবং type safety বজায় রাখে, তবে বিশেষ পরিস্থিতিতে আরও উপযোগী হতে পারে যেখানে টেমপ্লেটের আচরণ নির্দিষ্ট ইনপুট টাইপের জন্য আলাদা করতে হয়।
Read more