بعد از C++14 و C++17 حالا نوبت C++20 هست و ویژگیهای جدیدی که به این زبان اضافه شده و در این مطلب سعی میکنم تعدادی از این ویژگیها رو لیست کنم.
ماژولها راهی برای جایگزین کردن header فایلها هستند، در ماژولها نیاز هست که به صورت صریح چیزهایی که قرار است قابل استفاده باشند (مانند: توابع، کلاسها) را export کنید. فایلهای interface و فایلهای implementation نیازی نیست که از هم جدا باشند، هر چند که این امکان وجود دارد.
برای استفاده از یک ماژول باید از import استفاده کنید.
بعد از import کردن ماژول مد نظر، فقط میتوانید از توابع، کلاسها و ... که export شدهاند استفاده کنید و استفاده از بقیه موارد باعث به وجود آمدن خطای کامپایل میشه.
همانطور که در مثال بالا میبینید، کتابخانه استاندارد C++ را هم میتوانید به جای #include به کمک import به برنامه اضافه کنید.
در ماژولها نیازی به نوشتن include guard ندارید.
وقتی متغیری، تابعی، کلاسی و یا تعریف نوع دادهای export نشده است، نیازی نیست که نگران تداخل نامش با دیگر ماژولها باشیم.
ماژولها فقط یکبار کامپایل میشوند و اگر بخشی از یک ماژول که export نشده است تغییر کند، فقط ماژول مجدد کامپایل میشود و دیگر سورس کدهایی که از این ماژول استفاده کردهاند نیازی به کامپایل مجدد ندارند، برخلاف اتفاقی که در header فایلها میافتاد.
و در نهایت ترتیب import کردن ماژولها اهمیتی ندارد. چرا که ماکروهایی که در یک ماژول تعریف شدهاند در بیرون ماژول تاثیری ندارند.
البته در زمانی که در حال نوشتن این مطلب هستم، تنها کامپایرهای MSVC و Clang این ویژگی را پیادهسازی کردهاند و خبری از این ویژگی در GCC نیست.
کانسپتها، روشی برای محدود کردن پارامترهای تمپلیتی است، به شکلی که میتوانیم محدودیتها را تعریف کنیم و از این تعریف برای پارامترهای تمپلیتی استفاده کنیم.
برای این ویژگی، دو کلمه concept و requires به استاندارد زبان اضافه شده است. در بلاک مربوط به requires شرایط و محدودیتها را مینویسیم و این شرایط در زمان کامپایل بررسی میشوند.
کانسپتهای بسیار پیچیدهتری هم میتوان تعریف کرد.
کانسپتها را میتوان با یکدیگر ترکیب کرد و کانسپتهای جدیدتری ایجاد کرد.
کانسپتها را به شکل دیگری نیز میتواند استفاده کرد.
و صد البته خود کتابخانه استاندارد زبان، حاوی تعداد زیادی کانسپت تعریف شده در <concepts> است.
در زمان نوشتن این مطلب، کانسپتها تقریبا در هر سه کامپایلر پر استفاده C++ یعنی MSVC، Clang و GCC پیاده سازی شدهاند.
این کتابخانه جدید در اصل مجموعهای از کانسپتها، کلاسها و متدهاست، که در <ranges> تعریف شده است.
مفهوم یا کانسپت range شامل تمامی انواع دادهای میشود که std::ranges::begin و std::ranges::end برای آن نوع داده تعریف شده باشد.
یکی از اهداف اصلی این کتابخانه کار راحتتر و بدون ایراد با iterator هاست.
به کمک range factories، هم میتوانیم subrange های جدید بسازیم و از آنها استفاده کنیم.
ویژگی اصلی دیگر ranges امکان فیلتر کردن، تغییر دادن و انجام عملیات زنجیرهای بر روی مجموعهای از دادههاست، البته به صورت کاهلانه (lazy)! که به کمک view ها امکان پذیر است.
نکته بسیار مهم این هست که تا زمانی که بر روی این range حرکت (iterate) نکنیم، این توابع اجرا نمیشوند. همین ویژگی به ما این امکان را میدهد تا بر روی rangeهای نامتناهی کار کنیم!
تعداد ویژگیهای C++20 خیلی بیشتر از سه موردی است که در این مطلب گفتم، برای آشنایی بیشتر با این ویژگیها پیشنهاد میکنم که ویدئوهای کنفرانس امسال CppCon در یوتیوب را ببینید.