حامد ذقاقی
حامد ذقاقی
خواندن ۳ دقیقه·۴ سال پیش

ویژگی‌های 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 برگرداند
تعریف کانسپتی با این شرایط که فراخوانی تابع 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
استفاده از views::counted برای ساخت یک subrange  بر روی data

ویژگی اصلی دیگر ranges امکان فیلتر کردن، تغییر دادن و انجام عملیات زنجیره‌ای بر روی مجموعه‌ای از داده‌هاست، البته به صورت کاهلانه (lazy)! که به کمک view ها امکان پذیر است.

استفاده از filter برای فیلتر کردن دیتای ورودی به زنجیره
استفاده از filter برای فیلتر کردن دیتای ورودی به زنجیره
استفاده از take  برای برداشتن بخشی از نتایج
استفاده از take برای برداشتن بخشی از نتایج
استفاده از transform برای تغییر داده‌ها در انتهای زنجیره
استفاده از transform برای تغییر داده‌ها در انتهای زنجیره

نکته بسیار مهم این هست که تا زمانی که بر روی این range حرکت (iterate) نکنیم، این توابع اجرا نمی‌شوند. همین ویژگی به ما این امکان را می‌دهد تا بر روی rangeهای نامتناهی کار کنیم!

تعداد ویژگی‌های C++20 خیلی بیشتر از سه موردی است که در این مطلب گفتم، برای آشنایی بیشتر با این ویژگی‌ها پیشنهاد می‌کنم که ویدئوهای کنفرانس امسال CppCon در یوتیوب را ببینید.





cpp20سی‌پلاس‌پلاسconceptrangesmodules
شاید از این پست‌ها خوشتان بیاید