C++ স্ট্যান্ডার্ডস কমিটি সর্বদা প্রতি তিন বছরে নতুন ফিচার রিলিজ করার ওপর ফোকাস করে। স্পেসিফিকেশনের দুটি মূল অংশ হল প্রোগ্রামিং ল্যাঙ্গুয়েজের কোর ফাংশনালিটি এবং স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি (STL)। নতুন ফিচারগুলো কোডকে ক্লিনার, সহজ এবং কম্প্যাক্ট बनाने জন্য পরিচয় করানো হয়েছে। নিচে পরিচয় করানো ফিচারগুলো তালিকাভুক্ত করা হলো:
১. ফোল্ড এক্সপ্রেশন (Fold Expressions)
ফোল্ড এক্সপ্রেশন ব্যবহার করা হয় একটি ফাংশনে পাস করা বা ফাংশন থেকে রিটার্ন করা ভেরিয়েবল সংখ্যক আর্গুমেন্টের জন্য ছোট কোড লিখতে। এটি যেকোনো সংখ্যক ভেরিয়েবল আর্গুমেন্ট হিসেবে এবং ফাংশনের রিটার্ন স্টেটমেন্টে ব্যবহার করতে সক্ষম করে।
সিনট্যাক্স:-
- Unary right fold - ( pack op1 ... )
- Unary left fold - ( ... op1 pack )
- Binary left fold - ( init op1 ... op1 pack )
- Binary right fold - ( pack op1 ... op1 init )
এখানে pack হল একটি প্যারামিটার প্যাক যেটি যেকোনো সংখ্যক ভেরিয়েবলের জন্য এক্সপ্যান্ড করা যায়। op1 হল একটি অপারেটর। ( -, + , <=, >=, <, > , ==, *, / ... )। বাইনারি ফোল্ডে, উভয় op1 একই অপারেটর।
init হল একটি এক্সপ্রেশন যেটি এক্সপ্যান্ড করা যায় না।
উদাহরণ
#include <iostream>
#include <string>
using namespace std;
template<typename ...Args>
auto addition(Args ...args){
return (args + ... + 0);
}
template<typename ...Args>
auto sum2(Args ...args){
return (args + ...);
}
int main(){
cout << "Sum is : "<<addition(1,1,1,1,1) << endl;
cout << "Sum 2 is : "<<addition ( 1,2,3);
}
আউটপুট
Sum is : 5 Sum 2 is : 6
২. স্ট্রাকচার বাইন্ডিং (Structure Bindings)
এগুলো একাধিক ভেরিয়েবল ডিক্লেয়ার করতে ব্যবহৃত হয় যেগুলো পেয়ার, টাপল ইত্যাদিতে মান দিয়ে ইনিশিয়ালাইজ করা হয়। এই সব ভেরিয়েবলের বাইন্ডিং ইনিশিয়ালাইজারের সাথে একক স্টেটমেন্টে করা হয়।
কেস ১:- একটি অ্যারে বাইন্ড করা
আইডেন্টিফায়ার লিস্টের প্রতিটি আইডেন্টিফায়ার অ্যারেতে উপাদানের একটি lvalue-এর নাম হয়ে যায়। উপাদানের সংখ্যা অবশ্যই আইডেন্টিফায়ারের সংখ্যার সমান হতে হবে।
int arry[3] = { 3,4,5 };
auto [a,b,c] = arry;
//এখানে অ্যারে তৈরি হয়েছে এবং a ৩-কে, b ৪-কে এবং c ৫-কে রেফার করে।
কেস ২:- টাপল-লাইক টাইপ বাইন্ড করা
float fnum{};
char ch1{};
int number{};
std::tuple < float&, char&&, int > tplex( fnum, std::move(ch1) , number);
const auto& [ p, q, r] = tplex;
// p হল স্ট্রাকচার্ড বাইন্ডিংয়ের নাম যা fnum-কে রেফার করে
// q হল স্ট্রাকচার্ড বাইন্ডিংয়ের নাম যা ch1-কে রেফার করে
// r হল স্ট্রাকচার্ড বাইন্ডিংয়ের নাম যা number-কে রেফার করে
কেস ৩:- ডেটা মেম্বার বাইন্ড করা
struct structVar {
mutable int num1 : 2;
volatile double num2;
};
structVar func();
const auto [ a, b] = func();
// a হল ২-বিট বিট ফিল্ডের জন্য একটি int lvalue
// b হল একটি const volatile double lvalue
৩. ডায়রেক্ট লিস্ট ব্যবহার করে enum ইনিশিয়ালাইজেশন
C++17-এ enumগুলো এখন ব্রেস ব্যবহার করে ইনিশিয়ালাইজ করা যায়।
সিনট্যাক্স:-
enum byte : unsigned char {}; byte b0 {0}; // OK byte b1 = byte{1}; // OK byte b2 = byte{256}; // ERROR - 0 to 255 only
৪. If এবং Switch-এ ভেরিয়েবল ডিক্লেয়ারেশন
C++17 if এবং switch কন্ডিশনের ভিতরে ভেরিয়েবল ডিক্লেয়ার করার অনুমতি দেয়। এটি একই নামে কিন্তু ভিন্ন স্কোপের ভেরিয়েবল ব্যবহার করা সহজ করে তোলে।
সিনট্যাক্স:-
if (data type variable condition) { //statements } switch ( condition; variable ) { //statements }
৫. If constexpr স্টেটমেন্ট
টেমপ্লেট কোডের জন্য উপকারী ফিচার। if constexpr স্টেটমেন্ট কম্পাইল টাইমে ইভ্যালুয়েট করা হয়।
এটি কীভাবে সহায়ক তা নিচের তুলনায় দেখানো হলো:-
সাধারণ If-else স্টেটমেন্ট:-
int var = 10; if (var >= 10) { var=var+10; } else { var=var-10; }
Constexpr If-else স্টেটমেন্ট:-
template <typename T> auto length ( T const& value ) { //checking if T is integer or not if (is_integral<T>::value) { return value; } else { return value.length(); } }
৬. নেস্টেড نیمস্পেস (Nested Namespaces)
নিমস্পেসগুলো একসাথে মিলিত কোড গ্রুপ করতে ব্যবহৃত হয় যেমন ক্লাস এবং ফাংশন যা পারস্পরিকভাবে সম্পর্কিত। C++17 নেস্টেড নিমস্পেস ব্যবহারের আরও সহজ সিনট্যাক্স দেয়। আগে সিনট্যাক্সটি খুব গুলগুলে হতো যখন নেস্টেড নিমস্পেসের সংখ্যা বেশি হতো। ব্রেস হ্যান্ডলিং আর দরকার নেই।
C++17-এর আগে:-
namespace Earth{ namespace Continent { namespace Country { class City { .......... }; } } }
নতুন সিনট্যাক্স:-
namespace Earth :: Continent :: Country { class City { .......... }; }