Variadic Templates and Fold Expressions in C++
Variadic Templates এবং Fold Expressions হল C++11 এবং C++17-এ যোগ করা দুটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে আরও সাধারণ এবং নমনীয় কোড লেখার সুযোগ দেয়। এই বৈশিষ্ট্যগুলি বিশেষভাবে কাজে লাগে যখন আপনি একাধিক আর্গুমেন্ট নিয়ে কাজ করছেন এবং ঐতিহ্যগত ফাংশন প্রোটোটাইপগুলি যথেষ্ট নমনীয় নয়।
১. Variadic Templates (ভ্যারিয়াডিক টেমপ্লেট)
Variadic Templates C++-এ একটি ফিচার যা আপনাকে একাধিক আর্গুমেন্ট গ্রহণ করার জন্য একটি টেমপ্লেট ক্লাস বা ফাংশন ডিফাইন করতে দেয়। এটি ... (ellipsis) সিনট্যাক্স ব্যবহার করে এবং ডিপ্লিকেট আর্গুমেন্ট ছাড়াই একাধিক প্যারামিটার নিয়ে কাজ করতে সাহায্য করে।
বৈশিষ্ট্য:
- একাধিক আর্গুমেন্ট গ্রহণ: Variadic Templates আপনাকে যেকোনো সংখ্যক আর্গুমেন্ট পাস করার সুযোগ দেয়।
- রিকারসিভ (Recursive) টেমপ্লেট: Variadic Templates সাধারণত রিকারসিভ টেমপ্লেট ফাংশন বা ক্লাসের মাধ্যমে কাজ করে, যেখানে প্রতিটি আর্গুমেন্ট আলাদাভাবে প্রক্রিয়া করা হয়।
উদাহরণ: Variadic Function Template
#include <iostream>
// Variadic template function definition
template <typename T>
void print(T arg) {
std::cout << arg << std::endl;
}
template <typename T, typename... Args>
void print(T arg, Args... args) {
std::cout << arg << " ";
print(args...); // Recursive call with remaining arguments
}
int main() {
print(1, 2.5, "Hello", 'A'); // 1 2.5 Hello A
return 0;
}আউটপুট:
1 2.5 Hello Aএখানে print ফাংশনটি একটি variadic template function, যা একাধিক আর্গুমেন্ট গ্রহণ করে এবং প্রত্যেকটি আর্গুমেন্টকে প্রিন্ট করে। প্রথমে ফাংশনটি একটি আর্গুমেন্ট নিয়ে কাজ করে, তারপর বাকি আর্গুমেন্টগুলির জন্য আবার নিজেকে কল করে (রিকারসিভ কল)।
২. Fold Expressions (ফোল্ড এক্সপ্রেশন)
Fold Expressions C++17-এ পরিচিত একটি বৈশিষ্ট্য যা variadic templates এর সাথে কাজ করে। এটি একটি নতুন সিনট্যাক্স প্রদান করে, যার মাধ্যমে আমরা সহজে একাধিক আর্গুমেন্টের ওপর অপারেশন করতে পারি, বিশেষত সেগুলিকে যোগ, গুণ, অথবা অন্যান্য কার্যকরী অপারেশন করতে।
Fold expressions variadic templates-এর উপর ভিত্তি করে কাজ করে এবং এটি একটি নতুন উপায় প্রদান করে, যেখানে আপনাকে সবার ওপর অপারেশন করার জন্য রিকারসিভ টেমপ্লেট কলের প্রয়োজন হয় না। এর মাধ্যমে একটি একক এক্সপ্রেশন দিয়ে সব আর্গুমেন্টের ওপরে কার্যকরী অপারেশন করা যায়।
সিনট্যাক্স:
- Unary fold:
(... op pack)— প্রতিটি আর্গুমেন্টে অপারেশন করতে। - Binary fold:
(pack op ... op)— প্রথম আর্গুমেন্টের সাথে পরবর্তী আর্গুমেন্টগুলো মিলিয়ে অপারেশন করা।
উদাহরণ: Unary Fold Expression
#include <iostream>
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // Unary fold expression
}
int main() {
std::cout << sum(1, 2, 3, 4, 5) << std::endl; // Output: 15
return 0;
}আউটপুট:
15এখানে (args + ...) ব্যবহার করা হয়েছে, যা সমস্ত আর্গুমেন্টের ওপর যোগফল অপারেশন করে। এটি unary fold এক্সপ্রেশন, যেটি সমস্ত আর্গুমেন্টের ওপর একক অপারেশন প্রয়োগ করে।
উদাহরণ: Binary Fold Expression
#include <iostream>
template <typename... Args>
auto multiply(Args... args) {
return (args * ...); // Binary fold expression
}
int main() {
std::cout << multiply(1, 2, 3, 4) << std::endl; // Output: 24
return 0;
}আউটপুট:
24এখানে (args * ...) ব্যবহার করা হয়েছে, যা সমস্ত আর্গুমেন্টের ওপর গুণফল অপারেশন করে। এটি binary fold এক্সপ্রেশন, যেখানে সমস্ত আর্গুমেন্টকে একে একে গুণ করা হয়।
৩. Fold Expressions এর সুবিধা:
- কোড সরলীকরণ: Variadic templates এবং fold expressions দিয়ে কোড লেখা অনেক সহজ এবং পরিষ্কার হয়, বিশেষত যখন একাধিক আর্গুমেন্ট নিয়ে কাজ করতে হয়।
- রিকারসিভ কল থেকে মুক্তি: পূর্বে variadic templates ব্যবহার করার সময়, রিকারসিভ কলের মাধ্যমে একাধিক আর্গুমেন্টের ওপর অপারেশন করতে হতো। fold expressions এর মাধ্যমে আমরা রিকারসিভ কল ছাড়াই এটি করতে পারি।
- গতি: fold expressions সাধারণত রিকারসিভ টেমপ্লেট কলের তুলনায় দ্রুত হয়, কারণ এটি এক্সপ্রেশন হিসেবে অপারেশন সম্পাদন করে।
৪. Variadic Templates এবং Fold Expressions এর ব্যবহার:
উদাহরণ: মিশ্র অপারেশন এবং String Concatenation
#include <iostream>
#include <string>
template <typename... Args>
std::string concatenate(Args... args) {
return (args + ...); // Unary fold expression for string concatenation
}
int main() {
std::cout << concatenate("Hello, ", "world", "! ", "How are you?") << std::endl;
return 0;
}আউটপুট:
Hello, world! How are you?এখানে, সমস্ত স্ট্রিং আর্গুমেন্টগুলি একত্রিত (concatenate) করা হয়েছে। fold expression স্ট্রিংগুলোকে একসাথে যোগ করে।
উপসংহার
- Variadic Templates: C++-এ ফাংশন বা ক্লাসে একাধিক প্যারামিটার (আর্গুমেন্ট) নিয়ে কাজ করার জন্য একটি শক্তিশালী ফিচার।
- Fold Expressions: C++17-এ একটি নতুন বৈশিষ্ট্য যা variadic templates এর সাথে সহজে অপারেশন করার সুযোগ দেয়, বিশেষত arithmetic অপারেশনগুলোর ক্ষেত্রে।
এই দুটি বৈশিষ্ট্য C++ প্রোগ্রামিংকে আরও নমনীয়, শক্তিশালী এবং সংক্ষিপ্ত করে তোলে, বিশেষ করে যখন একাধিক আর্গুমেন্টের সাথে কাজ করতে হয়।
Read more