ویژگی‌های C++20

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