رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

کامبیز اسدزاده

بنیـــان گذار
  • تعداد ارسال ها

    505
  • تاریخ عضویت

  • روز های برد

    266

تمامی مطالب نوشته شده توسط کامبیز اسدزاده

  1. کامبیز اسدزاده

    قوانین مرتبط با بخش ویژه‌ی درخواست پروژه

    با سلام و احترام، ضمن حُسنِ تشکر از انتخاب شما برای مشارکت در این مرجع، لازم بذکر است تا قوانین از قبل تعیین شده برای مشارکت به عنوان درخواست دهنده یا انجام دهنده‌ی پروژه‌ها در قالب‌های (پژوهشی، تجاری و آزاد) مطالعه شود. این مرجع به عنوان محلی از جمع مدیران و اساتید شایسته از جامعه‌ی برنامه‌نویسی ایران است که در آن بنا به درخواست کاربران جهت راهنمایی و منتورینگ در پروژه‌ها از نوع برون سپاری یا مشارکتی بخش ویژه‌ای ایجاد گردیده است. ما در این بخش در نظر داریم طبق برنامه و قوانین مشخص خدماتی برای پروژه‌هایی که شما در آن‌ها نیاز به راهنمایی، حل مسائل، توسعه و یا انجام پروژه از نوع برون سپاری دارید را ارائه دهیم. ارسال درخواست در این بخش تنها افرادی که در مرجع عضویت رسمی دارند (ثبت‌نام آن‌ها کامل و با مشخصات واقعی کامل شده باشد) می‌توانند پست‌های خود را مبنی بر درخواست ارسال کنند. پست‌های شما توسط مدیران و اساتید مرجع مورد بررسی قرار گرفته و در صورت عدم مغایرت با قوانین و اصول درخواستی تایید خواهد شد. پاسخ به درخواست تنها مدیران و اساتید و افرادی که تجربه‌ی کافی از لحاظ تجاری و علمی (فنی) دارند دسترسی برای پاسخ به درخواست‌های شما خواهند داشت. بنابراین بر اساس این محدودیت ما سعی کرده‌ایم تنها افرادی را که از لحاظ علمی صاحب نظر هستند را به عنوان مربی یا پیمان‌کار شما معرفی کنیم که شرایط مرتبط با کسب مجوز نیز در سند زیر آمده است. مسئولیت‌های مرجع مرجع آی‌او‌استریم، هیچ مسئولیتی در قبال انجام یا عدم انجام پروژه‌های شما نخواهد داشت! لذا ما تنها با معرفی اساتید این بستر را برای شما فراهم می‌کنیم! بنابراین تایید و عدم تایید نهایی پروژه مبنی بر رضایت و عدم رضایت از انجام یا پاسخ آن را شما باید مشخص کنید. البته مدیران مرجع به عنوان همیاری شما برای کارشناسی کردن پاسخ نهایی همراه شما خواهند بود. بنابراین امتیازیاتی که شما به انجام دهنده خواهید داشت به عنوان نمره‌ی مثبت یا منفی اعمال خواهد شد که موجب افزایش یا کاهش اعتبار پاسخ دهده می‌شود. قوانین تجاری به زودی...
  2. کامبیز اسدزاده

    قبلاً گزارشی در مورد این مشکل داده شده که در این بخش خیلی‌ها بهش تاکید کردن، منم به گزارش خطا رو ارسال کردم. مشکل صرفاً به مقدار بازگشتی ماکرو مربوط بود که تو هر تنظیماتی مثل (/std:c++latest /Zc) مقدار 199711L رو میداد. بر اساس گزارش حل شده‌ای که دادن احتمالاً در نسخه‌های اخیر حل شده باشه اما بعید می‌دونم به صورت پیشفرض و با همین تنظیمات استاندارد مشکلش حل شده باشه چون نتیجه‌ای ازش نگرفتم.
  3. این تاپیک جهت معرفی و اطلاع رسانی در رابطه با اهداف نسخه‌های جدید، به‌روز‌رسانی‌ها، تاریخ انتشار و موارد مرتبط با آن ایجاد شده است. در این تاپیک به موضوعات مرتبط خواهیم پرداخت. جهت شروع نسخهٔ ۵.۱۲.۰ کیوت با پشتیبانی LTS را معرفی می‌کنیم. همانطور که می‌دانید کمپانی و تیم توسعه‌دهنده با فعالیت‌های بسیار زیاد خود مُدام در حال به‌روز رسانی و حل مشکلات بازخورد شده از سمت کاربران برای این کتابخانه هستند. بر خلاف نسخه‌های پیشین نسخه‌های سری ۵ با به‌روز‌رسانی‌های پی‌در‌پر مواجه شده است که شاید این بزرگترین تمایز تیم توسعه دهنده در نسخه‌های قبلی است. کتابخانهٔ کیوت معمولاً در نسخه‌های اصلی از ویژگی‌ها و تغییرات چشمگیری مواجه می‌شود که می‌توان آن‌ها را در تغییرات یا افزوده شدن به ماژول‌های هسته، فرعی و افزونه‌های آن اشاره کرد. البته به این مورد نیز باید اشاره کنیم که این به‌روز‌رسانی‌ها تنها برای خود کتابخانه نبوده و معمولاً محیط توسعهٔ آن نیز همراه خود به‌روز‌رسانی و حتی به صورت جداگانه منتشر می‌شود که در اینجا تاپیک مخصوص آن آورده شده است. از آنجایی که انتظار می‌رود کیوت در نسخهٔ ۵.۱۲.۰ با به‌روز‌رسانی‌های اساسی آمده است. یکی از مهمترین آن‌ها تغییر بر روی کامپایلر‌ها و پشتیبانی کامل از استاندارد‌های جدید C++ است. در این نسخه کامپایلر‌های GCC به نسخهٔ ۸ و کامپایلر‌های Clang به نسخهٔ ۷ و مهمتر از همه در محیط ویندوز به‌روز رسانی MinGW به نسخهٔ ۷ بوده است. البته ناگفته نماند با توجه به تغییرات اخیر گوگل در NDK که اعلام کرده است کامپایلر پیشفرض GCC به Clang تغییر کرده است این تغییر نیز در کیوت اعمال و با هماهنگی ۱۰۰٪ از ویژگی‌های جدید توسعه اندروید هماهنگ شده است. بنابراین شما در بخش کیت‌ها شاهد وجود کامپایلر‌های متعددی خواهید بود که به‌روز رسانی شده اند. نکتهٔ مهم برای توسعه دهندگان ویندوز : اگر به خاطر داشته باشید در نسخه‌های ۵.۱۰.۰ به بعد کامپایلر ۳۲ بیتی MSVC به طور غیر منتظره‌ای حذف شده بود که با بازخورد کاربران روبرو و در نهایت در این نسخه نسخهٔ ۳۲ بیتی کامپایلر MSVC افزوده شده است. مهمترین به‌روزرسانی‌های کیوت ۵.۱۲.۰ ویژگی‌های اضافه شده به هسته: افزوده شدن ویژگی جدید CBOR به عنوان فرمت جدید همانند JSon برای سریالیز داده‌ها. افزوده شدن متد hashLength برای QCryptographicHash که طول خروجی هَش شده را بر می‌گرداند. افزوده شدن متد wildcardToRegularExpression به QRegularExpression جهت معرفی راحت‌تر کد کاربر. افزوده شدن متد anchoredPattern به QRegularExpression جهت پیاده سازی تطبیق کد کاربر. افزوده شدن QRegularExpression برای کلاس QSortFilterProxyModel ویژگی‌ها و تغییرات در QtGui افزوده شدن پشتیبانی از ویژگی Windows UI Automation در WinRT QPA برای برنامه‌های مبتنی بر UWP که آن را قادر می‌سازد تا با ابزار‌های قابل دسترس در سمت UI دسترسی داشته باشند. جایگزین شدن ویژگی‌های مرتبط با دستگاه‌های ورودی mouse، touchpad، touchscreen و tablet با ویژگی‌های متحد بر پایهٔ ویندوز ۸ و جدیدتر. افزوده شدن QGradient جدید بر پایه https://webgradients.com افزوده شدن فرمت‌های 4xU16 ،RGBA64 به QImage جهت خواندن فرمت‌های PNG و TIFF و همچنین امکان آپلود و گرفتن آن‌ها از OpenGL. ویژگی‌ها و تغییرات در QtNetwork افزوده شدن DTLS برای پشتیبانی از UDP افزوده شدن یک بازنگری مجدد برای ترنسفر ایمن در بک‌اِند. افزوده شدن پشتیبانی از ALPN در پروتکل HTTP/2 جهت امنیت ترنسفر اطلاعات. افزوده شدن پشتیبانی از ویژگی PKCS#8 در بک‌اِند عمومی (WinRT و ترنسفر اطلاعات) افزوده شدن QPasswordDigestor به عنوان یک فضای نام که شامل توابعی برای استخراج کلید بر پایه رمزعبور می‌باشد (در حال حاضر PBKDF1 و PBKDF2) در دسترس هستند. ویژگی‌ها و تغییرات در QtQml پشتیبانی از موتور نسخهٔ ۸ جاوا اسکریپت فراهم شده است (ECMAScript 7) ماژول ECMAScript می‌تواند به طور مستقیم توسط QJSEngine::importModule() بارگذاری شود و می‌تواند فایل‌های .qml را در زمان استفاده از فایل‌های .mjs را فراهم سازد. ویژگی‌ها و تغییرات در QtQuick نوع‌های Pointer Handlers به Input Handlers تغییر نام پیدا کرده‌اند (البته ویژگی‌های مربوط به این دسته در این شاخه وجود دارند) و اکنون به طور کامل به عنوان یک ویژگی پشتیبانی شده در یک کلاس QML تحت Qt Quick پشتیبانی می‌شود. (رابط‌های برنامه‌نویسی سمت سی‌پلاس‌پلاس برای آن‌ها هنوز عمومی نشده است). نوع HoverHandler نوع جدیدی برای شناسایی ویژگی Mouse hover می باشد. این ویژگی‌ می‌تواند شناور ماوس را در موارد عمیقی شناسایی کند. بر خلاف MouseArea، شما می‌توانید چندین آیتم با HoverHandler به صورت هم‌زمان قرار دهید (برای مثال نوار کناری (SideBar) و یک دکمه‌ بر روی آن. نوع DragHandler به عنوان یک نوع چند-نقطه‌ای بشمار می‌رود. اگر شما مقدار minimumPointCount را به ۲ تغییر دهید، به کشیده شدن تنها با دو انگشت واکنش نشان خواهد داد. این ویژگی می‌تواند به مراتب آزادی‌های بیشتری را در توسعه به شما ارائه دهد. کشیده شدن توسط یک انگشت می‌تواند یک حرکت خاص را انجام دهد و کشیده شدن توسط دو انگشت می‌تواند کارهای دیگری را انجام دهد (به عنوان مثال زاویهٔ شیب را تغییر دهد). افزوده شدن پشتیبانی از مخازن از پیش تولید شدن جهت سرعت بخشید به اجرا در زمان استارت‌آپ. افزوده شدم آیتم TableView به عنوان یک نوع دیگری از نوع Item View همانند ListView که بر خلاف آن ویژگی چند ستونه شدن را دارا می‌باشد. بر خلاف Qt Quick 1.x ویژگی ظاهری برای آن طراحی نشده است. اما جای آن فراهم شده است تا توسط delegates ها بتوانید بر اساس تقاضا آن‌ها را فراهم کنید. ویژگی DelegateChooser به عنوان پیش نمایشی از تکنولوژی ارائه شده است که به عنوان delegate های Item Views ها مانند TableView بسته به مقادیر آن‌ها کاربرد دارد. ویژگی‌ها و تغییرات در QtQuick Controls 2.x کنترل Dial ویژگی inputMode را اضافه کرده است. که دو روش جدید جهت تعامل به صورت عمودی و افقی را فراهم می‌کند. این ویژگی‌های ورودی از یک سیستم ورودی نسبی استفاده می‌کنند. به این معنی است که بر خلاف سیستم ورودی مطلق قبلی، اغییرات در موقیع شماره گیری به آن اعمال می‌شود. این ویژگی در نتیجهٔ آن تاثیر می‌گدارد و باعث می‌شود شماره گیر پرش کمتری داشته و آن را از عملیاتی که ممکن است مضر باشد تضمین کند. کنترل Popup ویژگی‌های leftInset، bottomInset، topInset و rightInset را به بخش پس زمینه مشابه کنترل‌های paddings در contentItem اضافه کرده است. اضافه شدن خاصیت‌های implicitWidth و impliciyHeight ویژگی‌های implicitHeaderWidth و implicitContentWidth و غیره برای ساده سازی پیوند‌های اندازهٔ ضمنی و پیچیده ارائه شده است. در کنترل‌های SwipeView و DialogButtonBox خاصیت‌های contentWidth و contentHeight افزوده شده است. در کنترل RageSlider خاصیت valueAt() به عنوان تابع اضافه شده است، که اجازه می‌دهد تا مقادیر در هر زمان از تغییر برای tooltip به‌روز و تنظیم شوند. در کنترل RangeSlider خاصیت‌های first.mode() و second.mode() به عنوان سیگنال‌هایی مشابه سیگنال moved() اضافه شده‌اند. در آیتم پایه Control، در صورتی که به صراحت مشخص شده باشد، baselineOffset به صورت خودکار فاصلهٔ بالای کنترل و baselineOffset از contentItem را کنترل می‌کند. مشخص سازی استایل برای این کنترل نیاز نیست. در کنترل Popup، خاصیت‌های anchors.centetIn به عنوان یک راه حل مناسب اجازه تنظیم مرکز یک popup را می‌دهد. آیتم QQuickStyle، افزوده شدن ویژگی‌های stylePathList() و addStylePath() به عنوان مدیریت فهرستی از سبک‌های موجود در کیوت کوئیک کنترل ۲ را فراهم می‌کند. کنترل Slider، RangeSlider ویژگی touchDragThreshold را برای پیکربندی آستانهٔ شروع کشیدن (لمس) لغزنده فراهم می‌کند. کشیدن ماوس در این ویژگی تاثیری ندارد. در کنترل‌های TextArea و TextField خاصیت placeHolderTextColor برای راحتی کار برای افزودن رنگ در متن پیشفرض و نمایشی در پس زمینهٔ کنترل اضافه شده است. در ویژگی Material، یک سری موارد مورد استفادهٔ انبوه برای استفاده از این سبک در پلتفرم‌های دسکتاپ افزوده شده است.برخی از کنترل‌ها از ارتفاع و اندازهٔ قلم کوچکتری استفاده می‌کنند. جهت پیکربندی آن نیز می‌توان از متغیر QT_QUICK_CONTROLS_MATERIAL_VARIANT جهت مشخص سازی تراکم و یا با تنظیم Variant=Dense در فایل پیکربندی qtquickcontrols2.conf استفاده کرد. کنترل DialogBoxButton خاصیت buttonLayout به آن اضافه شده است که می‌تواند برای ترتیب و مرتب ساختن دکمه‌ها از آن استفاده شود. کنترل Tumbler، تابع positionViewAtIndex() را اضافه کرده است که می‌تواند عملکرد توابع مربوط به PathView و ListView را بسته به مقدار آن‌ها بسته بندی کند. این امکان اجازه می‌دهد تا مقدار currentIndex بدون انیمیشن تغییر یابد. در Control و Popup، خاصیت‌های horizontalPadding و verticalPadding به عنوان روش مناسب جهت تنظیم جپ و راست و یا بالا و پایین فاصله‌ها در یک حرکت در نظر گرفته شده است. کنترل Tooltip، روش‌های show() و hide() را برای نمایش پارامتر‌های خاص اضافه کرده است. ویژگی‌ها و تغییرات در QtSerialBus افزوده شدن یک افزونهٔ مجازی CAN برای شبیه سازی CAN بدون سخت‌افزار. افزوده شدن گزینه‌های پیکربندی برای canbusutil برای عنوان برای تنظیم میزان بیت‌ریت. افزوده شدن CAN FD به پلاگین PeakCAN. افزوده شدن توابع readAllFrames() و clear() به QCanBusDevice. ویژگی‌ها و تغییرات در QtWebEngine به‌روز رسانی شده به Chromium 69 رابط QWebEngineUrlScheme برای تنظیم و پیکربندی نوع و امنیت در طرح‌های سفارشی URL. ویژگی‌های WebActions در معرض QML قرار گرفته‌اند. اکنون می‌توان صفحه‌هاتی که آن‌ها را خوانده وی ا از آن‌ها دانلودی صورت گرفته است را خواند. گواهی‌نامه‌های SSL از این پس پشتیبانی می‌شوند. خواندن آن‌ها از تنظیمات macOS و Windows و بانک اطلاعاتی NSS در Linux امکانپذیر است. ویژگی‌ها و تغییرات در Qt Labs Platform در آیتم‌های Menu، MenuItem و SystemtryIcon خاصیت iconName و iconSource منسوخ شده است. در آیتم‌های Menu، MenuItem و SystemtryIcon خاصیت icon.mask افزوده شده است. ویژگی‌ها و تغییرات در Qt Virtual Keyboard یک رابط واسط برای کلید مجازی تعریف شده است. تمامی روش‌های ورودی فعلی و برخی از ویژگی‌های ویژهٔ لایه‌های آن مانند Hunspell، OpebWnn و غیره به ویژگی‌های اضافی منتقل شده‌اند. این ویژگی اجازه می‌دهد تا ساخت و ساز‌های نوع سوم بدون دستکاری ورودی‌های پیشفرض این ماژول صورت بگیرد. با معرفی این ماژول افزونه‌های اضافی می‌توانند با آن لینک شوند. این ماژول رابط‌های برنامه‌نویسی لازم ++C را برای ایجاد یک روش ورودی جدید فراهم می‌کند. افزوده شدن گزینهٔ build time به امکان محدود سازی تمامی سبک‌ها در پلاگین را فراهم می‌کند. پشتیبانی از MyScript برای تشخیص دست نویس اضافه شده است. ویژگی تشخیص Vietnamese در دست خط اضافه شده است. افزوده شدن لایه‌های جدید، آلبانی، آمریکایی، انگلیسی، فرانسوی، کانادایی، اندونزیایی، مالایی، پرتغال برزیبی، اسلواکی، اسلوونیایی، اسپانیایی مکزیکی، تایلندی، ترکی، ویتنامی و اکراینی. لایه‌های بیشتر در بارهٔ زبان روسی نیز اضافه شده است. برخی از لغت نامه‌ها به صورت پیش فرض تحت یک افزونه اضافه شده‌اند. فرهنک لغت کاربری Hunspell افزوده شده است. ویژگی‌ها و تغییرات در Qt Bluetooth افزوده شدن توانایی جهت کشف داده‌ها از طریف QBluetoothDeviceDiscovery ویژگی‌ها و تغییرات در Qt 3D افزوده شدن ویژگی جهت بارگیری درون یک فایل که شامل نام و شناسهٔ مشخصی است در بخش نمایه به عنوان انیمیشن فراهم شده است. فعال شدن منحنی‌های ثابت در انیمیشن. رفع مشکلات مربتط با QNodes ها در برخی شرایط. رفع و بهبود در نمایش بافت‌ها در اشیاء نوع TextureImage دیگر به عنوان فرزند بافت در نظر گرفته نمی‌شود. زمانی که در یک حلقهٔ شبیه سازی شده قرار گرفته نشود، استفاده از پردازنده کاهش پیدا خواهد کرد. نوع EntityLoader از این پس قادر به بارگیری از یک Component به خوبی یک فایل است. پشتیبانی از سیستم رندرینگ OpenGL ES 3.1 فراهم شده است. عملکرد‌ها و یک سری باگ‌ها در بخش بک اند رفع و کارآیی آن بهبود داده شده است. ویژگی‌ها و تغییرات در Qt Wayland Compositor افزوده شدن پشتیبانی از نسخهٔ پایدار xdg-shell (همچنین نسخهٔ ناپایدر ۵ آن منسوخ شده است). پشتیبانی از xdg-decoration-unstable-v1 برای سمت سرور جهت اعمال دکوراسیون پنجره‌ها اعمال شده است. ویژگی‌ها و تغییرات در Qt WebSocket تابع "bytesToWrite" به این ماژول افزوده شده است. ویژگی‌ها و تغییرات در Qt Location پلاگین MapboxGL به‌روز‌رسانی شده و پشتیبانی از QNX7 فراهم شده است. حذف خاصیت‌های add و remove و افزوده شدن آن به MapItemView آیتم MapItemView هم‌اکنون کلاس MapItemGroup را طبقه بندی می‌کند و به خودی خوب غیر قابل تغییر می‌باشد. در حال حاضر PlaceSearchModel اجازه می‌دهد تا مدل به صورت پراکنده پُر شود. ویژگی Map.visibleArea جهت محدود کردن مناطق قابل مشاهده بر روی نقشه اضافه شده است. ویژگی geoShape در آیتم‌های مربوط به MapItem به صورت R/W تنظیم شده است و یک تنظیم کننده مجازی در کلاس پایه دارد. پشتیبانی از نگه‌دارندهٔ حفره‌ها در QGeoPolygon فراهم شده است. افزوده شدن پشتیبانی از Route Legs به پلاگین. ویژگی‌ها و تغییرات در Qt Test خطاهای مربوط به std::tuple در زمان استفاده از QCOMPARE تشخیص داده می‌شوند. ماژول‌های جدید افزوده شدن ماژول Qt Remote Objects با پشتیبانی کامل. افزوده شدن پلاگین Qt WebGL Streaming با پشتیبانی از استریم در مرورگر و اپلیکیشن‌های تحت وب. تغییرات مرتبط با پلتفرم‌ها در QTimeZone از ICU در صورتی که در دسترس باشد استفاده می‌کند (اولویت استفاده با Api‌ مایکروسافت می‌باشد). در سیستم‌عامل macOS پشتیبانی از QSurfaceType::MetalSurface فراهم شده است. در macOS پشتیبانی از QSurfaceType::VulkanSurface و QVulkanWindow از طریق MoltenVK فراهم شده است. در Wayland نسخهٔ پایدار xdg-shell افزوده و نسخهٔ ناپایدار ۵ آن منسوخ شده است. با استفاده از پنجره‌های پیشفرض نمایش آن‌ها زیباتر و بهتر شده است. پشتیبانی از ویژگی‌های اضافی xdg-decoration-unstable-v1 و xdg-output-unstable-v1 فراهم شده است. فناوری‌های جدید به عنوان پیش‌نمایش ویژگی Qt for WebAssembly امکان این را فراهم می‌سازد تا برنامه‌های تحت کیوت در بستر مرورگر‌ با استفاده از WebAssembly اجرا شوند. تغییرات مرتبط با Qt for Automation ویژگی Qt MQTT پشتیبانی کامل از پروتکل MQTT سطح ۵ ویژگی Qt KNX پشتیبانی از KNXnet/IP Core نسخهٔ ۲ پشتیبانی از KNXnet/IP Routing نسخهٔ ۱ پشتیبانی از KNXnet/IP Tunneling نسخهٔ ۲ پشتیبانی از KNXnet/IP و برقراری ارتباط از طریق TCP پشتیبانی از KNXnet/IP Secure به صورت پیش نمایش از فناوری ویژگی Qt OPC UA پشتیبانی از Events‌ها افزوده شدن رابط‌های برنامه‌نویسی جهت خواندن به صورت دسته‌ای افزوده شدن رابط‌های برنامه‌نویسی جهت نوشتن به صورت دسته‌ای افزوده شدن یک TranslateBrowsePathsToNodeIds به رابط‌های برنامه‌نویسی رابط‌های مرورگری بهبود یافته شده پشتیبانی از انواع Argument و ExpandedNodeId نود‌ها می‌توانند از این پس از به وسیلهٔ ExpandedNodeId استفاده شوند. پشتیبانی از آرایه های چند بعدی بهبود یافته است. پشتیبانی از خواندن و نوشتن اشیاء اضافی فراهم شده است. ماژول‌های منسوخ (حذف در نسخه‌های بعدی) ماژول Qt Script ماژول Qt Quick Controls 1 ماژول Qt Canvas 3D
  4. کامبیز اسدزاده

    خلاصه‌‌ای از رویداد نشست 2018 زبان ++C

    دو هفته پیش، نشست ۲۰۱۸ سی‌پلاس‌پلاس آغاز شد. شرکت کننده‌ها مدال‌های خودشان را دریافت کردند چرا که همه‌ چیز با هماهنگی بسیار خوبی به پایان رسید. این رویداد به عنوان یکی از چندین رویداد مهمC++ بشمار می‌رود که هرساله توسط حامیان و علاقه‌مندانش برگزار می‌شود. سخنان کلیدی امسال در این رویداد سه یادداشت کلیدی وجود داشت، که با حضور Andrei Alexandrescu ،Lisa Lippincott و Nicolai Josuttis ارائه شد. اولین سخنران Andrei Alexandrescu بود، او این کنفرانس را با افکار و اندیشه‌های خودش برای شروع آغاز کرد عنوان موضوع آن به بَد بودنِ کپی constexpr از static if اشاره می‌کرد. او یک سخنران سرگرم کننده است، بنابراین سخنرانی او بسیار طبیعی در مورد یادداشت‌های خودش منعکس می‌شد. همچنین او به عنوان یک توسعه‌دهنده‌ی ++C به نقاط بسیاری اشاره کرد که کمیته‌ی استاندارد سازی زبان حرف‌های او را تایید می‌کرد. سخنران دوم Lisa Lippincott روز دوم را با یک سخنرانی آغاز کرد که دیدگاه‌های مختلفی در مورد محاسبات و منطق که در آن به کار می‌رود ارائه داد. زمانی که مُجری لیزا را دعوت کرد، می‌دانست که این موضوع به عنوان یک نکته مهم برای فکر کردن است، چیزی که همه نمی‌توانند به طور مستقیم آن را درک کنند و به آن دسترسی پیدا کنند. اما این تلنگری برای نحوه‌ی درک کُد از دیدگاه ریاضی و دیدگاه جدیدی بود. سخنران سوم و آخر Nicolai Josuttis بود که در مورد، او اولین سخنران در نشست Hartmut Kaiser در سال ۲۰۱۴ بود. در آن سخنرانی بسیار خوب درخشیده، بنابراین در قسمت سوم نقص‌هایی را با جزئیات در مورد نقاط خشن ++C نشان داد. این سخنرانی بسیار صادقانه بود! چرا که بسیاری از جزئیات خشن بودن سی‌پلاس‌پلاس را عنوان کرد که همگی با آن موافق بودند. مذاکرات، مسابقه و گفتگوها‌ی چند دقیقه‌ای جلسات و رویداد‌های مرتبط با ++C همیشه گفتگو‌های بسیار خوبی دارد، و با یک مسیر مشخص که هدفش آوردن سخنرانان جدید با دیدگاه‌های جدید است برگزار می‌شود. بازخورد سخنران‌ها در این رویداد خوب بود چرا که به برخی از نکات در مورد چگونگی بهبود‌ها اشاره کردند. تصویر بالا مربوط به Hana Dusíková است که می‌توان به آن بهترین نمره را داد. بهترین سخنرانی هم مربوط به Andrei Alexandrescu بود که دنبال شد. در اولین عصر این رویداد، امتحان (Quiz) برجسته‌ترین مورد رویداد در آن روز بود. سازماندهی آن توسط Diego و اسپانسری آن توسط Conan است که برای چند سال اخیر حمایت شده است. به نظر می‌رسید که سوالات امتحانی این سال سخت‌تر از سوالات رویداد قبلی در سال گذشته بوده است. اما بار دیگر این سرگرمی ترکیب بسیار خوبی با ترس از سی‌++ را داشت. هر یک از سوالات امتحانی یک خروجی از کُد را تولید می‌کردند، که هر گروه باید برای کسب امتیاز آن را می‌نوشتند. ده نوع کُد امتحانی وجود داشت که تهیه کننده‌ی گزارش برای به تصویر کشیدن آن‌ها زیاد خوب عمل نکرده است. بنابراین تصویر زیر مربوط به سوالات چالشی در مورد سی‌پلاس‌پلاس است: گفتگو‌های کوتاه در طی جلسات سی‌پلاس‌پلاس صورت می‌گیرد. اما در سال‌های گذشته روش به گونه‌ای تغییر یافته است که سوالات پرسیده شده باید با گفتگو‌ها و سوالات دیگر رقایبت می‌کردند. با این حال این یک قالب و روش جالبی بود که نتیجه‌ی موفقیت آمیزی را داشت. همه‌ی شرکت کننده‌ها می‌توانستند این سوالات رو ببینند و در مورد آن‌ها تفکر کرده و پاسخ دهند. نکته: شما می‌توانید تصاویر ویدیویی مربوط به این رویداد را از کانال رسمی آن در یوتیوب دریافت کنید.
  5. کامبیز اسدزاده

    توکِن JWT چیست و چه کاربردی دارد؟

    ما به شما پیشنهاد می‌کنیم که دربارهٔ انتقال ایمن اطلاعات توسط JSon Web Token بیشتر بدانید. یک وب‌توکت از نوع جی‌سان (JWT) یک استاندارد باز از (RFC7519) می‌باشد که که یک روش جمع‌ و جور و خود مختار را برای ایمنی اطلاعات بین ترنسفر اطلاعات در JSon را تعریف می‌کند. این اطلاعات به عنوان اطلاعات مورد اعتماد قابل تایید می‌باشند زیرا آن‌ها امضای دیجیتالی شده‌اند. تراکنش‌های مربوط به JWT را می‌توان با استفاده از یک کلید مخفی عمومی/خصوصی امضا کرد. ساختار وب‌توکن جی‌سان چکونه است؟ Header Payload Signature هدر یا عنوان (Header) معمولاً شامل دو قسمت است: نوع توکن، که JWT است، و الگوریتم هَش کننده که استفاده می‌شود. مانند الگوریتم‌های HMAC ،SHA256 و یا RSA. برای مثال: { "alg": "HS256", "typ": "JWT" } سپس، این جی‌سان که از نوع Base64-URL کد نگاری شده است قسمت اول JWT را تشکیل می‌دهد. بخش دوم Payload قسمت دوم توکن ها، payload است که اظهارات را در برمی‌گیرد. اظهارات ثبت شده (Registered claims): این‌ها مجموعه‌ای از اظهارات از پیش تعریف شده است که اجباری در به کار گیری آن‌ها نیست، اما توصیه می‌شود تا مجموعهٔ مفیدی را ارائه دهد. اظهارات عمومی(Public claims): اینها می‌توانند توسط کسانی که از JWT استفاده می‌کنند تعریف کنند. اما برای جلوگیری از برخورد بهتر است تعریف شوند. اظهارات خصوصی(Private claims): این اظهارات سفارشی ایجاد شده برای به اشتراک گذاشتن اطلاعات بین طرفین است که توافق بر روی استفاده از آن‌ها می‌باشد نه اظهارات ثبت شده یا عمومی. یک مثال از payload به صورت زیر نشان داده شده است: { "sub": "1234567890", "name": "John Doe", "admin": true } امضاء برای ایجاد بخش امضاء شما باید هدر کُد شده را جهت امضا شدن دریافت کنید که شامل payload رمزینه شده، یک کد خاص و الگوریتم مشخص شده‌ای می‌باشد. HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) سپس، شما باید همهٔ این‌ها را باهم دیگر ترکیب کنید. نمونهٔ زیر یک JWT را نشان می‌دهد که حاوی هدر‌ قبلی و payload رمز شده است که در نهایت آن با یک رمز ویژه امضاء شده است. اگر شما می‌خواهید تا با JWT بیبشتر آشنا شوید و این مفاهیم را در عمل اجرا کنید، می‌توانید از jwt.io استفاده کنید.
  6. سلام و درود بر کاربران عزیز مرجع، جهت راحتی و مشاهدهٔ محتوای مرجع بر اساس سلیقهٔ شما کاربران عزیز افزونه‌‌ی تغییر فونت با بسته‌های ویژهٔ فونت فارسی بر روی وب‌سایت اعمال شد. ? برای استفاده از آن می‌توانید بر روی گزینهٔ A در عنوان صفحه کلیک و فونت مورد نظر خود را انتخاب نمایید.
  7. کتابخانه‌ی Libcurl به خوبی از ویژگیِ Multi Session به عنوان ارسال و دریافت درخواست‌های هم‌‌زمان پشتیبانی می‌کنه این ویژگی به شما اجازه میده تا درخواست‌های هم‌زمان با تعداد بسیار بالا رو مدیریت کنید (بدون اینکه نگران از دست رفتن حتی یکی از سشِن‌ها بشید).
  8. سلام، بسیاری از ما زمانی که می‌خواهیم از سرویس Rest استفاده کنیم، یا صفحه‌ای از وب‌سایت را تجزیه کنیم و یا حتی زمانی که نیاز داریم یک ربات یا خزندهٔ ساده بنویسیم؛ این برای ما سوال بسیار بزرگی می‌شود که از چه روش و کتابخانه‌ای باید استفاده کنیم. همانطور که می‌دانید متاسفانه، کتابخانهٔ پیشفرض و استاندارد ++C تا قبل از اینکه نسخهٔ 2a آن ارائه شود هیچ امکانی را در رابطه با حوزهٔ شبکه ارائه نمی‌دهد. بنابراین ما مجبور هستیم تا به کمک کتابخانه‌های دیگر این زبان برنامهٔ خود را توسعه دهیم. ما نیاز داریم تا بدانیم چگونه به کمک امکانات موجود در کتابخانه‌های غیر پیش‌فرض می‌توانیم کار با شبکه را مدیریت کنیم. من فکر می‌کنم آی‌او‌استریم محل مناسبی برای نوشتن این برگهٔ تقلب در رابطه با این موضوع باشد. بنابراین در این مقاله قصد دارم برخی از روش‌های موجود تحت چند کتابخانهٔ مختص این کار را برای شما معرفی کنم. قبل از هر چیز لیست کتابخانه‌های مناسب برای این کار را در نظر داشته باشید: WinInet WinHttp Casablanca Qt POCO wxWidgets Boost.Asio libcurl neon .NET (С++/CLI) IXMLHTTPRequest HappyHttp cpp-netlib کتابخانهٔ WinInet ارائه شده توسط مایکروسافت (پشتیبانی از ویندوز ۹۸ به بعد) #include <tchar.h> #include <wininet.h> /// .... HINTERNET hIntSession = ::InternetOpen(_T("MyApp"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); HINTERNET hHttpSession = InternetConnect(hIntSession, _T("api.twitter.com"), 80, 0, 0, INTERNET_SERVICE_HTTP, 0, NULL); HINTERNET hHttpRequest = HttpOpenRequest( hHttpSession, _T("GET"), _T("1/statuses/user_timeline.xml?screen_name=twitterapi"), 0, 0, 0, INTERNET_FLAG_RELOAD, 0); TCHAR* szHeaders = _T("Content-Type: text/html\nMySpecialHeder: whatever"); CHAR szReq[1024] = ""; if( !HttpSendRequest(hHttpRequest, szHeaders, _tcslen(szHeaders), szReq, strlen(szReq))) { DWORD dwErr = GetLastError(); /// handle error } CHAR szBuffer[1025]; DWORD dwRead=0; while(::InternetReadFile(hHttpRequest, szBuffer, sizeof(szBuffer)-1, &dwRead) && dwRead) { szBuffer[dwRead] = 0; OutputDebugStringA(szBuffer); dwRead=0; } ::InternetCloseHandle(hHttpRequest); ::InternetCloseHandle(hHttpSession); ::InternetCloseHandle(hIntSession); کتابخانهٔ WinHttp ارائه شده توسط مایکروسافت (پشتیبانی از ویندوز 2000 به بعد) DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; BOOL bResults = FALSE; HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; // Use WinHttpOpen to obtain a session handle. hSession = WinHttpOpen( L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 ); // Specify an HTTP server. if( hSession ) hConnect = WinHttpConnect( hSession, L"www.microsoft.com", INTERNET_DEFAULT_HTTPS_PORT, 0 ); // Create an HTTP request handle. if( hConnect ) hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE ); // Send a request. if( hRequest ) bResults = WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0 ); // End the request. if( bResults ) bResults = WinHttpReceiveResponse( hRequest, NULL ); // Keep checking for data until there is nothing left. if( bResults ) { do { // Check for available data. dwSize = 0; if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) ) printf( "Error %u in WinHttpQueryDataAvailable.\n", GetLastError( ) ); // Allocate space for the buffer. pszOutBuffer = new char[dwSize+1]; if( !pszOutBuffer ) { printf( "Out of memory\n" ); dwSize=0; } else { // Read the data. ZeroMemory( pszOutBuffer, dwSize+1 ); if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded ) ) printf( "Error %u in WinHttpReadData.\n", GetLastError( ) ); else printf( "%s", pszOutBuffer ); // Free the memory allocated to the buffer. delete [] pszOutBuffer; } } while( dwSize > 0 ); } // Report any errors. if( !bResults ) printf( "Error %d has occurred.\n", GetLastError( ) ); // Close any open handles. if( hRequest ) WinHttpCloseHandle( hRequest ); if( hConnect ) WinHttpCloseHandle( hConnect ); if( hSession ) WinHttpCloseHandle( hSession ); کتابخانهٔ Casablanca ارائه شده درCodeplex (پشتیبانی از تمامی پلتفرم‌ها) http_client client(L"http://www.myhttpserver.com"); http_request request(methods::GET); client.request(request).then([](http_response response) { // Perform actions here to inspect the HTTP response... if(response.status_code() == status_codes::OK) { } }); کتابخانهٔ Qt ارائه شده درQt (پشتیبانی از تمامی پلتفرم‌ها) #include "handler.h" Handler::Handler(QObject *parent) :QObject(parent) { http = new QHttp(this); connect(http, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int))); connect(http, SIGNAL(responseHeaderReceived(QHttpResponseHeader)), this, SLOT(responseHeaderReceived(QHttpResponseHeader))); connect(http, SIGNAL(requestFinished(int,bool)), this, SLOT(requestFinished(int,bool))); } void Handler::doHttp() { http->setHost("google.com"); http->get("/"); } void Handler::stateChanged(int state) { switch(state) { case 0: qDebug() << "Unconnected"; break; case 1: qDebug() << "Host Lookup"; break; case 2: qDebug() << "Connecting"; break; case 3: qDebug() << "Sending"; break; case 4: qDebug() << "Reading"; break; case 5: qDebug() << "Connect"; break; case 6: qDebug() << "Closing"; break; } } void Handler::responseHeaderReceived(const QHttpResponseHeader &resp) { qDebug() << "Size : " << resp.contentLength(); qDebug() << "Type : " << resp.contentType(); qDebug() << "Status Code : " << resp.statusCode(); } void Handler::requestFinished(int id, bool error) { qDebug() << "Request Id : " << id; if(error) { qDebug() << "Error"; } else { qDebug() << http->readAll(); } } مثالی از نسخهٔ Qt5 void Downloader::doDownload() { manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); manager->get(QNetworkRequest(QUrl("http://google.com"))); } void Downloader::replyFinished (QNetworkReply *reply) { if(reply->error() != QNetworkReply::NoError) { qDebug() << "ERROR!"; qDebug() << reply->errorString(); } else { qDebug() << reply->header(QNetworkRequest::ContentTypeHeader).toString(); qDebug() << reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toString(); qDebug() << reply->header(QNetworkRequest::ContentLengthHeader).toULongLong(); qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); QFile file("C:/Qt/Dummy/downloaded.txt"); if(file.open(QFile::Append)) { file.write(reply->readAll()); } } reply->deleteLater(); } کتابخانهٔ Poco ارائه شده درPoco (پشتیبانی از تمامی پلتفرم‌ها) #include <Poco/Net/HTTPClientSession.h> #include <Poco/Net/HTTPRequest.h> #include <Poco/Net/HTTPResponse.h> #include <Poco/StreamCopier.h> #include <Poco/Path.h> #include <Poco/URI.h> #include <Poco/Exception.h> #include <iostream> #include <string> using namespace Poco::Net; using namespace Poco; using namespace std; int main(int argc, char **argv) { if (argc != 2) { cout << "Usage: " << argv[0] << " <uri>" << endl; cout << " fetches the resource identified by <uri> and print it" << endl; return -1; } try { // prepare session URI uri(argv[1]); HTTPClientSession session(uri.getHost(), uri.getPort()); // prepare path string path(uri.getPathAndQuery()); if (path.empty()) path = "/"; // send request HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); session.sendRequest(req); // get response HTTPResponse res; cout << res.getStatus() << " " << res.getReason() << endl; // print response istream &is = session.receiveResponse(res); StreamCopier::copyStream(is, cout); } catch (Exception &ex) { cerr << ex.displayText() << endl; return -1; } return 0; } کتابخانهٔ wxWidgets ارائه شده درwxWidgets (پشتیبانی از تمامی پلتفرم‌ها) #include <wx/sstream.h> #include <wx/protocol/http.h> wxHTTP get; get.SetHeader(_T("Content-type"), _T("text/html; charset=utf-8")); get.SetTimeout(10); // 10 seconds of timeout instead of 10 minutes ... // this will wait until the user connects to the internet. It is important in case of dialup (or ADSL) connections while (!get.Connect(_T("www.google.com"))) // only the server, no pages here yet ... wxSleep(5); wxApp::IsMainLoopRunning(); // should return true // use _T("/") for index.html, index.php, default.asp, etc. wxInputStream *httpStream = get.GetInputStream(_T("/intl/en/about.html")); // wxLogVerbose( wxString(_T(" GetInputStream: ")) << get.GetResponse() << _T("-") << ((resStream)? _T("OK ") : _T("FAILURE ")) << get.GetError() ); if (get.GetError() == wxPROTO_NOERR) { wxString res; wxStringOutputStream out_stream(&res); httpStream->Read(out_stream); wxMessageBox(res); // wxLogVerbose( wxString(_T(" returned document length: ")) << res.Length() ); } else { wxMessageBox(_T("Unable to connect!")); } wxDELETE(httpStream); get.Close(); کتابخانهٔ Boost.Asio ارائه شده درBoost (پشتیبانی از تمامی پلتفرم‌ها) #include <iostream> #include <istream> #include <ostream> #include <string> #include <boost/asio.hpp> using boost::asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cout << "Usage: sync_client <server> <path>\n"; std::cout << "Example:\n"; std::cout << " sync_client www.boost.org /LICENSE_1_0.txt\n"; return 1; } boost::asio::io_service io_service; // Get a list of endpoints corresponding to the server name. tcp::resolver resolver(io_service); tcp::resolver::query query(argv[1], "http"); tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); // Try each endpoint until we successfully establish a connection. tcp::socket socket(io_service); boost::asio::connect(socket, endpoint_iterator); // Form the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. boost::asio::streambuf request; std::ostream request_stream(&request); request_stream << "GET " << argv[2] << " HTTP/1.0\r\n"; request_stream << "Host: " << argv[1] << "\r\n"; request_stream << "Accept: */*\r\n"; request_stream << "Connection: close\r\n\r\n"; // Send the request. boost::asio::write(socket, request); // Read the response status line. The response streambuf will automatically // grow to accommodate the entire line. The growth may be limited by passing // a maximum size to the streambuf constructor. boost::asio::streambuf response; boost::asio::read_until(socket, response, "\r\n"); // Check that response is OK. std::istream response_stream(&response); std::string http_version; response_stream >> http_version; unsigned int status_code; response_stream >> status_code; std::string status_message; std::getline(response_stream, status_message); if (!response_stream || http_version.substr(0, 5) != "HTTP/") { std::cout << "Invalid response\n"; return 1; } if (status_code != 200) { std::cout << "Response returned with status code " << status_code << "\n"; return 1; } // Read the response headers, which are terminated by a blank line. boost::asio::read_until(socket, response, "\r\n\r\n"); // Process the response headers. std::string header; while (std::getline(response_stream, header) && header != "\r") std::cout << header << "\n"; std::cout << "\n"; // Write whatever content we already have to output. if (response.size() > 0) std::cout << &response; // Read until EOF, writing data to output as we go. boost::system::error_code error; while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error)) std::cout << &response; if (error != boost::asio::error::eof) throw boost::system::system_error(error); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } کتابخانهٔ Libcurl ارائه شده درLibcurl (پشتیبانی از تمامی پلتفرم‌ها) #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); /* example.com is redirected, so we tell libcurl to follow redirection */ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* always cleanup */ curl_easy_cleanup(curl); } return 0; } کتابخانهٔ Neon ارائه شده درNeon (پشتیبانی از تمامی پلتفرم‌ها) #include <ne_session.h> #include <ne_request.h> #include <ne_utils.h> #include <ne_uri.h> int httpResponseReader(void *userdata, const char *buf, size_t len) { string *str = (string *)userdata; str->append(buf, len); return 0; } int do_get(string host) { ne_session *sess; ne_request *req; string response; ne_sock_init(); sess = ne_session_create("http", host.c_str(), 80); ne_set_useragent(sess, "MyAgent/1.0"); req = ne_request_create(sess, "GET", "/SomeURL/method?with=parameter&value=data"); // if accepting only 2xx codes, use "ne_accept_2xx" ne_add_response_body_reader(req, ne_accept_always, httpResponseReader, &response); int result = ne_request_dispatch(req); int status = ne_get_status(req)->code; ne_request_destroy(req); string errorMessage = ne_get_error(sess); ne_session_destroy(sess); printf("result %d, status %d\n", result, status); cout << response << "\n"; switch (result) { case NE_OK: break; case NE_CONNECT: throw ConnectionError(errorMessage); case NE_TIMEOUT: throw TimeOutError(errorMessage); case NE_AUTH: throw AuthenticationError(errorMessage); default: throw AnotherWebError(errorMessage); } return 0; } کتابخانهٔ NET. ارائه شده در.NET (پشتیبان از ویندوز Xp به بعد) #using <System.dll> using namespace System; using namespace System::Net; using namespace System::Text; using namespace System::IO; // Specify the URL to receive the request. int main() { array<String^>^args = Environment::GetCommandLineArgs(); HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(WebRequest::Create( args[ 1 ] )); // Set some reasonable limits on resources used by this request request->MaximumAutomaticRedirections = 4; request->MaximumResponseHeadersLength = 4; // Set credentials to use for this request. request->Credentials = CredentialCache::DefaultCredentials; HttpWebResponse^ response = dynamic_cast<HttpWebResponse^>(request->GetResponse()); Console::WriteLine( "Content length is {0}", response->ContentLength ); Console::WriteLine( "Content type is {0}", response->ContentType ); // Get the stream associated with the response. Stream^ receiveStream = response->GetResponseStream(); // Pipes the stream to a higher level stream reader with the required encoding format. StreamReader^ readStream = gcnew StreamReader( receiveStream,Encoding::UTF8 ); Console::WriteLine( "Response stream received." ); Console::WriteLine( readStream->ReadToEnd() ); response->Close(); readStream->Close(); } کتابخانهٔ IXMLHTTPRequest ارائه شده در مایکروسافت (پشتیبان از ویندوز Xp به بعد) #include <atlbase.h> #include <msxml6.h> HRESULT hr; CComPtr<IXMLHTTPRequest> request; hr = request.CoCreateInstance(CLSID_XMLHTTP60); hr = request->open( _bstr_t("GET"), _bstr_t("https://www.google.com/images/srpr/logo11w.png"), _variant_t(VARIANT_FALSE), _variant_t(), _variant_t()); hr = request->send(_variant_t()); // get status - 200 if succuss long status; hr = request->get_status(&status); // load image data (if url points to an image) VARIANT responseVariant; hr = request->get_responseStream(&responseVariant); IStream* stream = (IStream*)responseVariant.punkVal; CImage *image = new CImage(); image->Load(stream); stream->Release(); کتابخانهٔ cpp-netlib ارائه شده در cpp-netlib (پشتیبان از همهٔ پلتفرم‌ها) using namespace boost::network; using namespace boost::network::http; client::request request_("http://127.0.0.1:8000/"); request_ << header("Connection", "close"); client client_; client::response response_ = client_.get(request_); std::string body_ = body(response_); حال وقت آن است که یکی را به عنوان بهترین انتخاب متناسب با هدف خود انتخاب کنیم. اگر شما به یک برنامهٔ کاملاً قابل اعتماد در این حوزه نیاز دارید بهتر است از Libcurl استفاده کنید. اگر قرار است برنامه‌ای توسعه دهید که دارای رابط کاربری است بهترین انتخاب Qt و برای آن‌هایی که از تمامی ویژگی‌های سی++۱۱ می‌خواهند استفاده کنند Casablanca گزینهٔ مناسبی است. اگر برنامهٔ شما تحت پلتفرم دات‌نِت توسعه داده می‌شود می‌توانید از NET. استفاده کنید، اما توجه داشته باشید که آن فقط محدود بر پلتفرم ویندوز خواهد بود. در صورتی که می‌خواهید برنامه‌ای توسعه دهید که شامل رابط کاربری نیست می‌توانید از Poco و Boost.Asio استفاده کنید که برای مدیریت جزئی‌تر ابزار‌های بسیاری در اختیار شما قرار خواهند داد. نکته: در استاندار ۲۰ شاهد افزوده شدن ماژول شبکه که از کتابخانهٔ Boost الهام گرفته است خواهیم بود.
  9. کامبیز اسدزاده

    چنین خطایی رو چند روز پیش گزارش دادن در این بخش که ظاهرا مشکل مشابه همین رو داره، بررسی کنید و سعی کنید نسخه‌ی ۲.۱ رو هم امتحان کنید.
  10. از نظر من استایل اول بهتر از استایل دوم هست. مستندات مربوط به Google C++ Style Guide رو هم بررسی کن.
  11. کامبیز اسدزاده

    من قبلاً در گروه به این مساله اشاره کرده بودم که همیشه نباید از ویژگی‌های جدید انتظار داشت که در هر جایی نتیجهٔ خوبی رو ارائه بدن، چون هر ویژگی در جای مناسب خودش کاربرد داره نه در هر جا! کد شما با پیشنهاداتی که دوستان دادن می‌تونه بهینه بشه حتی سریع‌تر از C! اما درستش اینه که از ویژگی std::function در چنین مواردی استفاده نکنید! به جاش از روش بهتری مانند template استفاده کنید. تابع SortArray رو به روش زیر باز‌نویسی کنید: template<typename T> void SortArray(std::array<unsigned int,MAX_LENGTH> &MyArray,T function){ for(unsigned int index=0;index < MAX_LENGTH;++index) for(unsigned int AnotherIndex=0;AnotherIndex<MAX_LENGTH;++AnotherIndex) if(function(MyArray[index],MyArray[AnotherIndex])) std::swap(MyArray[index],MyArray[AnotherIndex]); } مشخصات پلتفرم: پردازنده : Intel® Core™ i5-2400 CPU @ 3.10GHz × 4 سیستم‌عامل‌ : لینوکس ابنتو ۱۸.۱۰ مد کامپایل : Debug قبل از باز‌نویسی کُد تحت Clang نتیجهٔ زیر رو گرفتم: بعد از باز‌نویسی کُد تحت GCC 8.x نتیجه زیر: در نهایت بهترین نتیحه بدون بهینه سازی کامپایلر و یا تغییر در نحوهٔ پردازش روی Clang 7.x نتیجهٔ زیر رو دریافت می‌کنم. اینم مُد Release برای GCC 8.x اینم مُد Release برای Clang 7.x از پیشنهادات دوستان هم برای بهینه سازی بیشتر می‌تونید استفاده کنید. البته پیشنهاد می‌کنم همیشه تنظیمات پیشفرض کامپایلر رو تغییر ندین، تا جایی که می‌تونید کد‌هارو بهینه‌ بنویسید.
  12. کامبیز اسدزاده

    سلام، کافیه یک جستجوی ساده انجام بدین، این آموزش‌ها رو بررسی کنید. لینک ۱ و لینک ۲
  13. کامبیز اسدزاده

    ابزار Qt Visual Studio

    نگارش 2.4.2

    72 دریافت

    همانطور که می‌دانید محیط توسعه‌ی یکپارچه‌ی نرم‌افزار Visual Studio عنوان یکی از جامع‌ترین محیط‌های توسعه بسیار شناخته شده است. برنامه‌نویسان سی‌پلاس‌پلاس بسیاری از پروژه‌های خود را تحت این محیط علاوه بر آن کیوت کریتور توسعه می‌دهند. کتابخانه‌ی کیوت افزونه‌ای را برای یکپارچه سازی خود با محیط ویژوال استودیو ارائه داده است که در حالت عادی از کتابخانه‌ی Qt به خوبی پشتیبانی می‌کند و اجازه می‌دهد تا شما کُد‌های خود را که بر اساس کتابخانه‌ی کیوت هستند در محیط ویژوال استودیو توسعه و خروجی بگیرید. آخرین اخبار و گفتگو‌ها درباره‌ی این ابزار

    رایگان

  14. توی ویندوز راحت‌ترین و ساده ترین روش این هست که شما فایل ALL_BUILD.vcxproj رو با ویژوال استودیو باز کنید و کامپایلش کنید. اگر این فایل موجود نبود از داخل هر یک از ماژول‌های مربوطه فایل مربوط به پروژه رو باز کنید و کامپایلش کنید. در نظر بگیرید که باید OpenSSL بر روی سیستم شما هم نصب باشه.
  15. روش رو دقیقاً طبق همین توضیحات پیش بگیرید، با این تفاوت که در پلتفرم ویندوز هستید. این آموزش مرتبط رو هم مطالعه کنید : در صورتی که موفق نشدید اطلاع بدین تا آموزش مخصوصی در رابطه با این کتابخانه قرار داده شود.
  16. کامبیز اسدزاده

    هم در سی‌پلاس‌پلاس هم در کیو‌اِم‌اِل شما می‌تونید این کار رو انجام بدین. لینکی که در پاسخ قبل دادم شامل مثال‌ها و کلاس‌هایی است که شما می‌توانید به عنوان نمونه از آن‌ها الگو گیری کنید که به صورت Real-Time هم اجرا می‌شوند. مثال
  17. کامبیز اسدزاده

    من متوجه نشدم جملتون سوال بود یا چی!‌آخرش چی شد!؟ اگه سوالی هست، شما می‌تونید با استفاده از ماژول Qt Positioning اطلاعات مربوط به مکان و موقعیت را توسط دستگاه‌های GPS دار دریافت کنید. سپس توسط پلاگین نقشه در کیوت موقعیت آن را توسط یک مارکر (علامت موقعیت) نشان دهید.
  18. کامبیز اسدزاده

    اگر می‌خوای کارِت حرفه‌ای باشه توصیه می‌کنم طبق استاندارد پیش بگیرید و چیزی که گوگل خودش پیشنهاد کرده رو انجام بدین. در غیر این صورت هیچ اجباری حتی برای گذاشتن اسپلش اسکرین نیست ?
  19. کامبیز اسدزاده

    خب شما داخل فایل AndroidManifest.xml چه در جاوا و چه در سی‌پلاس‌پلاس باید دستور زیر رو داشته باشید. <!-- Splash screen --> <meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/> برای این کار باید در نظر داشته باشید که استاندارد‌های خود این پلتفرم رو پیاده سازی کنید، برای مثال در وضوح‌های مختلف به صورت زیر خواهد بود: ldpi = 240×320 pixels mdpi = 320×480 pixels hdpi = 480×800 pixels xhdpi = 720×1280 pixels در داخل پوشه‌ی res همچین ساختار زیر رو باید داشته باشید: | | |____res | | | |____drawable | | | | |____icon.png | | | |____drawable-hdpi | | | | |____icon.png | | | |____drawable-ldpi | | | | |____icon.png | | | |____drawable-mdpi | | | | |____icon.png | | | |____drawable-xhdpi | | | | |____icon.png تصاویر رو طبق روشی که گفته شد در مسیر خودش قرار بدین پروژه رو کامپال کنید.
  20. کامبیز اسدزاده

    سلام، با توجه به تگی که از Qt اضافه کردین این درخواست شما در حوزه‌ی سی++ و کیوت هست یا جاوا؟
  21. آیا این واقعاً امکان‌پذیر است؟ پاسخ : بله! من می‌دانم که ممکن است این مبحث تحت سی++ بسیار پیچیده و یک کار بیهوده‌ای باشد! اما واقعیت این است که تکنیک‌های پنهان بسیاری وجود دارد که ممکن است همه از آن باخبر نباشند! من قبلاً در مورد اینکه تحت ++C وب‌سایت میشه طراحی کرد یا خیر تحقیقاتی انجام داده بودم، از لحاظ امکان بودنش جواب مثبت بود اما اینکه به راحتی طراحی تحت Php یا دیگر زبان‌های برنامه‌نویسی باشه خیر! خُب طبیعیه چون شما بسیار راحت یه اسکریپت رو می‌نویسی و روی سرور اجراش می‌کنی و سایت شما به خوبی و خوشی بالا میاد! ممکن است در همین قسمت از موضوع شما به این نتیجه رسیده باشید که خُب نیازی به ادامهٔ بحث نداریم! وقتی کار سختیه پس منطقی نیست و شما احتمالاً دیوانه‌ای!!! ? واقعیت جریان این است بر خلاف آن چیزی که تصور کرده‌ایم طراحی وب‌سایت با سی‌پلاس‌پلاس نه تنها بسیار راحت است بلکه بسیار هم جذاب خواهد بود! اما در نگاه اول ممکن است یک سری محدودیت‌هارا داشته باشد که همهٔ این موارد با کمی تأمل و بررسی قابل حل هستند به قدری که وقتی درگیر این جریان باشید شیفتهٔ آن خواهید شد. مزایای یک وب‌سایت تحت سی‌پلاس‌پلاس نسبت به دیگر زبان‌های رایج سرعت خارق‌العاده و غیر قابل مقایسه با زبان‌های رایج امنیت بهتر کد‌های شما مدیریت ساده‌تر و انعطاف‌پذیری بالا مصرف بسیار بهینه‌ و غیر قابل تصور از منابع سرور دسترسی نامحدود به کتابخانه‌ها عدم محدودیت در دسترسی به برنامه‌نویسی سطح پایین عدم محدودیت در استفاده از توابع سیستم‌عامل عدم محدودیت در مدیریت سیستم و هر ویژگی‌ دیگری که در زبان‌های اسکریپتی اگر به آن نیاز داشته باشید مجبور هستید تا به صورت اکستنشن آن را تحت سی‌پلاس‌پلاس باز نویسی کنید. سیستم راه‌انداز وب‌سرور چگونه است؟ در هر سروری CGI به شما امکان این را می‌دهد که بتوانید تحت پروتکل‌های استاندارد برنامه‌های تحت وب را اجرا کنید. شما می‌توانید تحت آن و یا موارد دیگری مانند FastCGI و WSGI و دیگر موارد بهینه شدهٔ آن برنامهٔ تحت وب را بر روی سرور خود اجرا کنید. طراحی قالب هماهنگی با HTML, JavaScript, Css در سی‌پلاس‌پلاس چگونه خواهد بود؟ همهٔ گزینه‌های مربوط به وب را شما بدون هیچ محدودیتی در اختیار خواهید داشت. شما هیچ محدودیتی در استفاده از ویژگی‌های HTML5 یا CSS3 و یا JavaScript و دیگر فریمورک‌ها و کتابخانه‌های کارآمدی چون Angular.JS را نخواهید داشت. بنابراین از نظر طراحی رابط یک وب‌سایت همانند دیگر زبان‌های رایج می‌توانید روی آن حساب کنید. طراحی هسته و بک‌اِند وب‌سایت چگونه خواهد بود؟ همانند زبان‌ها و فریمورک‌های رایج تحت وب شما در سی‌پلاس‌پلاس می‌توانید هستهٔ وب‌سایت یا سیستم وب‌سایت خود را تحت استاندارد سی‌پلاس‌پلاس و هر کتابخانه‌ای که می‌پسندید و یا به آن تسلط دارید پیاده سازی کنید! به شرطی که قابلیت‌های آن کتابخانه پاسخگوی نیاز‌های شما باشد. با این حساب شما می‌توانید حتی سیستم مدیریت محتوای (CMS) خود را طراحی کنید! ? بله سیستم مدیریت محتوا تحت سی‌پلاس‌پلاس! کاملاً جدی هستیم ? قبل از هر چیز یک مزیت بسیار بزرگ در کنار مزیت‌های دیگر این است که یک CMS تحت سی‌پلاس‌پلاس می‌تواند داشته باشد مصرف بهینه از منابع سرور خواهد بود. برای مثال در یک مقایسهٔ‌ ساده و آزمایشی نتیجهٔ بسیار جالبی ارائه شده است. همانطور که می‌دانید Wordpress به عنوان یک سیستم مدیریت محتوای (بلاگ) شناخته شده و تحت Php توسعه‌ یافته است. نسخهٔ سریعتر و بهینه‌تر آن با نام Ghost تحت Node.JS توسعه یافته است که ما نسخهٔ توسعه‌ یافتهٔ آن را با یک عمل مشابه در C++1z مورد بررسی قرار داده ایم که نتایج آن بسیار جالب است! مصرف حافظه‌ سیستم مدیریت محتوای Tegra ۳۵۰۰ درخواست در هر ثانیه 3.6 مگابایت سیستم مدیریت محتوای Ghost 100 درخواست در ثانیه 120 مگابایت پشتیبانی از پایگاه‌های داده به لطف کتابخانه‌های عظیم سی‌پلاس‌پلاس امکان مدیریت یک وب‌سایت تحت پایگاه‌های داده مختلفی ممکن است. برای مثال تحت Qt شما می‌توانید به رایجترین درایور‌های بانک‌اطلاعاتی دسترسی داشته و سیستم خود را به آن‌ها مجهز کنید. نکته: احتمالاً در برنامه‌نویسی با نود جی‌اس و پی‌اچ‌پی شناختی با کتابخانه‌های OpenSSL, Libcurl و موارد این چنینی داشته اید! کتابخانه‌های فوق عضو لیست کتابخانه‌های C و ++C هستند. بنابراین شما علاوه بر دسترسی مستقیم بر آن‌ها به هزاران و شاید میلیون‌ها کتابخانه در دنیا سی‌پلاس‌پلاس خواهید داشت. نمونهٔ اولیه اما شوق‌آور برای اثبات امکان طراحی وب‌سایت تحت سی‌پلاس‌پلاس چندی پیش من تصمیم گرفتم تا سیستم وب‌سایتی را تحت Php7 برای یکی از استارت‌آپ‌ها طراحی و پیاده سازی کنم که در این پست به آن اشاره شده است. از آن‌جایی که به لطف کتابخانهٔ Qt برنامه‌های سمت کاربر را توسط سی‌پلاس‌پلاس پیاده سازی کرده بودم به این فکر افتادم چرا سمت سرور و بخش وب‌سایت هم با آن هماهنگ نشود!؟ اینگونه هماهنگی بین برنامه‌ها و پرفرمنس همهٔ آن‌ها بسیار افزایش خواهد یافت در اولین نگاه این تفکر بسیار ناشیانه و بسیار ناممکن بود! تنها روشی که به کار گرفته بودم ارسال اطلاعات از طرف کاربر به سمت سرور و مدیریت آن‌ها تحت معماری Restful Api بود که در قالب JSon آن‌ها را تجزیه و مدیریت می‌کردم. با کمی تحقیق در مورد ویژگی‌های سمت وب تحت Fast-CGI, uWSGI, DJango, ClearSilver و موارد مرتبط با آن‌ها سعی کردم تا صفحهٔ بسیار ساده‌ای از HTML را توسط سی‌پلاس‌پلاس هندل کنم. این کار نتایج بسیار موفقیت آمیزی را در بر داشت تا نتیجهٔ آن تبدیل به یک پروژهٔ سیستم مدیریت محتوا تحت ++C شد. من پروژه‌ای با نام مفهومی Tegra که نام پروژهٔ قبلی تحت Php بود را در محیط Qt Creator با C++17 و کتابخانهٔ Qt باز سازی کرده و هستهٔ اولیهٔ آن را برای اجرای چند صفحه از یک وب‌سایت، احراز هویت، بازخوانی و نمایش لیستی از خبر‌ها و مدیریت متا تگ‌ها و آدرس صفحات مربوط به هر صفحه را ایجاد کردم. سعی کرده ام در کمترین زمان ممکن برای آزمایش یک سری ویژگی‌های اولیه از یک وب‌سایت آن‌ها را مورد بررسی قرار بدم که عبارتند از هماهنگی با فریم‌ورک‌های طراحی مانند BootStrap و یا Angular.JS که خوشبختانه همه‌چیز بسیار خوب در کنار همدیگه کار می‌کنند. هستهٔ سیستم به صورت جدا و معماری طراحی آن بر پایهٔ MVC مورد آزمایش قرار گرفته است. در زیر تصاویری از صفحات تولید شده تحت سیستم‌ مدیریت محتوای ساخته شده با سی‌پلاس‌پلاس را مشاهده می‌کنید. ? همه چیز در قدم‌های اول قرار دارد و با توجه به سادگی تولید وب سایت بر خلاف تصوری که داشتیم بسیار توسعه و جای پیشرفت خواهد داشت. بخشی از نمونه کد‌های این سیستم به صورت زیر آورده شده است تا ذهنیتی برای توسعه‌دهندگان ارائه شود: تکه کُد زیر عمل ارسال اطلاعات و تمامی لینک‌های مربوط به بوت استرپ را برای سمت HTML ارائه می‌کند که در قالب استاندارد جدید C++17 آورده شده است: auto bootstrapCss = bootStrapLib.find("css"); if(bootstrapCss != bootStrapLib.end()) { c->setStash("BootstrapCss", bootstrapCss->second.c_str()); std::cout << "Found " << bootstrapCss->first << " " << bootstrapCss->second << '\n'; } کد مربوط به سمت قالب به صورت زیر خواهد بود: <!-- Bootstrap core css --> <link href="{{BootstrapCss}}" rel="stylesheet"> نتیجهٔ فوق در صورتی که CDN بر روی لوکال تنظیم شده باشد از روی کد‌های کامپایل شده و یا استاتیک فراخوانی خواهد شد. در غیر اینصورت از روی یکی از سرور‌های CDN فراخوانی می‌شوند. نحوهٔ ارسال متغیر از سمت سی‌پلاس‌پلاس به قالب بسیار ساده است! بسیار ساده از Php و یا Node.JS می‌باشد. با در نظر گرفتن ارسال اطلاعات از سمت سی‌پلاس‌پلاس به سمت رابط کاربری کافی است نام متغیر‌ها را در قالب خود اعمال کنید. {% for post in news %} <div class="blog-post"> <h2 class="blog-post-title"><a href="news/{{post.uri}}">{{post.title}}</a></h2> <p class="blog-post-meta">{{post.date}} by <a href="#">{{post.author}}</a></p> <p>{{post.announcement|safe}}</p> </div><!-- /.blog-post --> {% endfor %}</div> این ساختار بر پایهٔ ساختار Angular.JS و DJango پیاده سازی شده است که به طور کامل پشتیبانی می‌شود. فعال سازی فناوری Angular.JS بر روی این سیستم جهت طراحی قالب تنها با دو دستور ساده اعمال می‌شود: <!-- Link to AngularJS --> <script src= "{{AngularJs}}"></script> <!-- Enable AngularJS Engine --> {{AngularJsSync|safe}} این دستورات در هستهٔ سیستم مدیریت محتوا در کلاسی با نام Template پردازش و در نهایت به سمت HTML هندل می‌شوند. بخشی از دستورات سمت هسته در سی‌پلاس‌پلاس ۱۷ برای مثال ارسال عنوان صفحه به صورت زیر است: std::optional<std::string> LoadListTemplate::getTitle() const { if (isset(title)) { return title; } else { return std::nullopt; } } سمت HTML کافی است دستور فوق را در نظر بگیریم: <title>{{title}}</title> این‌ها مثال‌هایی از مراحل توسعهٔ این سیستم است که می‌دانم آنچنان گسترده نیست، اما برای ثابت کردن طراحی و توسعهٔ وب‌سایت تحت سی‌پلاس‌پلاس مثال‌های روشنی هستند. موفق و سربلند باشید! اطلاعیه‌های مربوط به این پروژه احتمالاً در کانال‌ها و گروه‌ تلگرامی و همین مرجع بازگو و در اختیار شما قرار گیرد.
  22. با سلام، در این پست من قصد دارم به چند ویژگی استاندارد 1z اشاره کنم که به شما اجازه میده تا کُد تمیزتر، ساده‌تر و خواناتری را ایجاد کنید. توسعه زبان‌های برنامه‌نویسی روز به روز بیشتر شده و سی++ به عنوان یک زبان پیچیده نیاز به این داره تا کاربران رو از لحاظ سادگی و مدرنیزه شدن سینتکس دلگرم کنه. در استاندارد جدید ۱۷ من برخی از ویژگی‌ها رو معرفی می‌کنم که در تمیز نوشتن و ساده نوشتن تاثیر بسیاری دارند. ویژگی ساختار‌های پیوندی این ویژگی یکی از ویژگی‌های جدید سی++ است که امکان پیوند شدن نام‌های مشخص و زیر اشیاء المنت‌های اولیه را می‌دهد. به عبارت ساده‌تر می‌توان گفت که، ساختار‌های پیوندی (Structured Bindings) این توانایی را برای ما می‌دهد تا متغیر‌های چند گانه از یک ساختار (struct) یا tuple را به هم دیگر متصل کنیم. *مهمترین هدف Structured Bindings در نسخهٔ ۱۷ ساده سازی و راحتی درک کد می‌باشد. سینتکس این ویژگی به صورت زیر است: auto ref-operator(optional)[identifier-list] = expression; // Or auto ref-operator(optional)[identifier-list]{expression}; // Or auto ref-operator(optional)[identifier-list](expression); اجازه دهید تا ما با استفاده ازیک مثال مزایای استفاده از ساختار‌های پیوندی را با کمک tuple ببینیم: در نسخهٔ ۹۸ سی‌پلاس‌پلاس: #include <iostream> using namespace std; // Creating a structure named Point struct Point { int x; int y; }; // Driver code int main() { Point p = {1, 2}; int x_coord = p.x; int y_coord = p.y; cout << "X Coordinate : " << x_coord << endl; cout << "Y Coordinate : " << y_coord << endl; return 0; } در نسخهٔ ۱۱ و ۱۴ سی‌پلاس‌پلاس: #include <iostream> #include <tuple> using namespace std; // Creating a structure named Point struct Point { int x, y; // Default Constructor Point() : x(0), y(0) { } // Parameterized Constructor for Init List Point(int x, int y) : x(x), y(y) { } auto operator()() { // returns a tuple to make it work with std::tie return make_tuple(x, y); } }; // Driver code int main() { Point p = {1, 2}; int x_coord, y_coord; tie(x_coord, y_coord) = p(); cout << "X Coordinate : " << x_coord << endl; cout << "Y Coordinate : " << y_coord << endl; return 0; } در نسخه‌‌ی ۱۷ سی‌پلاس‌پلاس: #include <iostream> using namespace std; struct Point { int x; int y; }; // Driver code int main( ) { Point p = { 1,2 }; // Structure binding auto[ x_coord, y_coord ] = p; cout << "X Coordinate : " << x_coord << endl; cout << "Y Coordinate : " << y_coord << endl; return 0; } ویژگی عبارت شرطی و حلقهٔ جدید نسخه‌های جدید از دستورات شرطی switch و if در سی‌پلاس‌پلاس به صورت زیر هستند: if (init; condition) و switch (init; condition) قبلاً شما باید به صورت زیر یک دستور شرطی را پیاده سازی می‌کردید: { auto val = GetValue(); if (condition(val)) // on success else // on false... } در این قالب مشخص است که val یک محدودهٔ جداگانه و احتمال نشتی دارد. در نسخهٔ جدید آن را می‌توان به صورت زیر ساده تر و خواناتر نوشت: if (auto val = GetValue(); condition(val)) // on success else // on false... در این نسخه val فقط در داخل حوزهٔ if و else قابل مشاهده است، بنابراین در این صورت امکان نشتی نخواهد داشت. شرط ممکن است هر نوع شرط باشد و فقط وابسته به val مقدار true/false را بر نمی‌گرداند. خُب، چرا این نسخه مفید خواهد بود؟ فرض کنید قرار است در داخل یک رشته چند چیز را جستجو کنید: const std::string myString = "My Hello World Wow"; const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" const auto it2 = myString.find("World"); if (it2 != std::string::npos) std::cout << it2 << " World\n" ما یا باید نام‌های مختلفی را برای it استفاده کنیم و یا باید آن‌ها را در داخل دامنهٔ جداگانه قرار دهیم. مانند مثال زیر: { const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" } { const auto it = myString.find("World"); if (it != std::string::npos) std::cout << it << " World\n" } عبارت شرطی جدید if یک دامنه اضافی را فقط در یک خط ایجاد می‌کند: if (const auto it = myString.find("Hello"); it != std::string::npos) std::cout << it << " Hello\n"; if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n"; همانطور که قبلاً ذکر شد متغیر تعریف شده در عبارت if نیز در بلوک else قابل مشاهده است. بنابراین شما می‌توانید آن را به صورت زیر نیز بنویسید: if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n"; else std::cout << it << " not found!!\n"; همچنین شما در استاندارد جدید می‌توانید از ويژگی پیوند ساختاری در عبارت شرطی نیز استفاده کنید که قالب آن به صورت زیر است: // better together: structured bindings + if initializer if (auto [iter, succeeded] = mymap.insert(value); succeeded) { use(iter); // ok // ... } // iter and succeeded are destroyed here ویژگی Variadic Templates در نسخهٔ ۱۱ ما ویژگی‌ خوبی به نام قالب‌های متنوع یا همان (Variadic Templates) داریم که بسیار عالی است، مخصوصاً وقتی که می‌خواهید با تعداد نامحدود یا متغیر با توابع کار کنید. برای مثال در نسخه‌های قبل از ۱۱ ما مجبور بودیم تا چندین تابع را با ورودی‌های مختلف پیاده سازی کنیم تا بتوانیم به نتیجهٔ مربوطه برسیم. در حال حاضر این ویژگی هنوز هم نیازمند افزودن کد‌های می‌باشد مخصوصاً اگر می‌خواهید تابعی از نوع بازگشتی پیاده سازی کنید. مانند مثال زیر: auto SumCpp11(){ return 0; } template<typename T1, typename... T> auto SumCpp11(T1 s, T... ts){ return s + SumCpp11(ts...); } در نسخهٔ جدید سی++۱۷ ما می‌توانیم این را بسیار ساده تر بنویسیم: template<typename ...Args> auto sum(Args ...args) { return (args + ... + 0); } و یا حتی ساده تر... template<typename ...Args> auto sum2(Args ...args) { return (args + ...); } این تابع فوق‌العاده است! ورودی‌های متغیر با نوع بازگشتی یکی از پر کاربرد‌ترین توابعی است که در نسخه‌های قبل پیاده سازی آن پیچیده بود. ویژگی متغیر‌های درون خطی (Inline variables) در قبل از سی++۱۷ ما می‌توانستیم از کلمهٔ کلیدی inline جهت بهینه‌سازی در زمان کامپال برای توابع استفاده کنیم. حال در نسخهٔ ۱۷ قابلیت تعریف inline برای متغیر‌ها نیز فراهم شده. فرض کنید قرار است متغیری را تعریف کنیم که به صورت ایستا و عمومی مورد استفاده قرار بگیرد. در قبل از نسخهٔ ۱۷ تعریف آن به این صورت که متغیر در فایل هدر و سورس اعلان و تعریف شوند: #ifndef MYCLASS_H #define MYCLASS_H class MyClass { public: MyClass(); static const int myVariable; }; #endif // MYCLASS_H فایل سورس #include "myclass.h" MyClass::MyClass() { } const int MyClass::myVariable = 17; و در نهایت تابع و فایل main: #include <iostream> #include "myclass.h" int main() { std::cout << "My global variable is : " << MyClass::myVariable << std::endl; return 0; } در استاندارد جدید تعریف تابع در همان زمان اعلان به صورت ایستا و عمومی امکان پذیر شده است. برای مثال: #ifndef MYCLASS_H #define MYCLASS_H class MyClass { public: MyClass(); inline static const int myVariable = 17; }; #endif // MYCLASS_H همین تعریف برای اعلان متغیر از نوع ایستا و عمومی کافی است. این کار باعث می‌شود نیازی برای تعریف مقدار متعیر در فایل سورس نباشد. مثال‌های دیگر : struct MyClass { static const int sValue; }; inline int const MyClass::sValue = 777; و یا ساده تر از آن به شکل زیر: struct MyClass { inline static const int sValue = 777; };
  23. کامبیز اسدزاده

    تعریف ماکرو یک ماکرو به عنوان یک قطعه کدی (رشته‌ای) است که به آن نام مشخصی داده شده است. قطعه کد مربوطه می‌تواند شامل رشته، عدد، شیء، تابع و دیگر موارد باشد. زمانی که از این نام استفاده شود آن را با محتوای موجود در ماکرو جایگزین می‌کند. به طور کلی دو نوع ماکرو وجود دارد Object-Like (شیء مانند) برای استفاده در زمانی که محتوا شامل اشیاء باشد و ‌Function-Like (تابع مانند) نیز زمانی مورد استفاده قرار می‌گیرد که شامل تابع می‌باشد. /* object-like macro */ #define <identifier> <replacement token list> /* function-like macro, note parameters */ #define <identifier>(<parameter list>) <replacement token list> نکته: ایجاد یک ماکروی سفارشی توسط دستور #define انجام می‌شود. /* create the macro */ #define <identifier> نکته: ماکرو‌های ایجاد شده توسط دستور #undef می‌توانند حذف شوند. /* delete the macro */ #undef <identifier> نکته: ماکرو‌ها علاوه بر اینکه می‌توانند توسط کاربر (توسعه‌دهنده) سفارشی ساخته شوند، همچنین از قبل به صورت از پیش تعریف شده برای انواع سیستم‌عامل‌ها، معماری‌ها و دیگر منظور‌ها ساخته شده اند که تحت استاندارد‌های کامپایلر‌ها متفاوت عمل می‌کنند. ماکرو‌ از نوع شیء (Object-Like) یک ماکرو از نوع شیء شناسه‌ی ساده‌ای است که با یک قطعه کد جایگزین می‌شود. آن را شیء مانند می‌نامند زیرا، به نظر می‌رسد یک شیء از نوع داده در آن مورد استفاده قرار می‌گیرد. معمولاً آن‌ها از نام‌های نمادین برای ثابت‌های عددی استفاده می‌شود. #define BUFFER_SIZE 1024 در کد فوق ماکروی BUFFER_SIZE دستور #define را دنبال می‌کند و مقدار ۱۰۲۴ را به عنوان مقدار آن در نظر می‌گیرد. در مثال زیر می‌توانید نحوه‌ی استفاده از یک ماکروی سفارشی از نوع شیء (Object-Like) را مشاهده کنید. #include <iostream> using namespace std; #define BUFFER_SIZE 1024 int main() { cout << "Buffer Size is : " << BUFFER_SIZE << endl; return 0; } ماکرو‌ از نوع تابع (Function-Like) همچنین شما می‌توانید از ماکرو‌ها مانند صدا زدن یک تابع استفاده کنید. این نوع ماکرو‌ها Function-Like هستند. برای تعریف این نوع شما باید از دستور پیش‌پردازنده‌ی #define استفاده کرده و دو پرانتز ر بلافاصله پس از نام ماکرو قرار دهید. در مثال زیر ماکرویی با نام Maximum را برای محاسبه‌ی بزرگترین عدد ورودی پیاده سازی کرده‌ایم. #include <iostream> using namespace std; #define Maximum( a, b ) a > b ? a : b int main() { int x = 4; int y = 9; int z = Maximum( x, y ); cout << "Result : " << z << endl; return 0; } نسخه‌ی معمولی آن می‌تواند به شکل زیر باشد. #include <iostream> using namespace std; int Maximum (int a, int b) { if (a > b) return a; else return b; } int main() { int x = 4; int y = 9; int z = Maximum( x, y ); cout << "Result : " << z << endl; return 0; } بعضی از موارد در حوزه‌ی سفارشی سازی ماکرو‌ها می‌تواند به صورت سلیقه‌ای و نسبت به نوع پروژه تعریف شوند. برای مثال قرار است در برنامه‌ای نوع اولویت اشکال‌زدائی را مشخص کنیم. #include <iostream> using namespace std; #define DEBUG # if defined (DEBUG) # define DEBUG_LEVEL 5 #endif # if DEBUG_LEVEL < 3 # define DLEVEL "Low Level" # elif DEBUG_LEVEL > 3 # define DLEVEL "High level" #endif int main() { cout << "Debug level is : " << DLEVEL; return 0; } در کد بالا توسط پیش پردزنده‌ی #define و پیش پردازنده‌‌های شرطی #if و #elif و #endif حالتی را ایجاد کرده‌ایم که با مشخص سازی درجه‌ی مشخصه DEBUG_LEVEL نتیجه‌ی آن اعلام خواهد شد. ماکرو‌های از پیش تعریف شده بسیاری از ماکرو‌های از پیش تعریف شده توسط کامپایلر‌ها و شرکت‌های سازنده وجود دارد که در توسعه بسیار مفید و کاربردی هستند. برای مثال اگر نیاز باشد کد شما بر اساس نوع پلتفرمی که بر روی آن اجرا می‌شود واکنش متفاوتی را انجام دهد نیاز خواهد بود تا از چنین ماکرو‌های پرکاربری استفاده کنید. مثال‌های زیر برخی از ماکرو‌های از پیش تعریف شده بر اساس استاندارد ISO را معرفی می‌کند. استاندارد‌های زبان نوع : __STDC__ تعریف شده برای استاندارد‌های ANSI X3.159-1989 | ISO/IEC 9899:1990 نوع : __STDC_VERSION__ تعریف شده C برای استاندارد‌های ISO/IEC 9899-1:1994 | ISO/IEC 9899:1999 | ISO/IEC 9899:2011 نوع : __cplusplus تعریف شده ++C برای استاندارد‌های ISO/IEC 14882:1998 | ISO/IEC 14882:2011 | ISO/IEC 14882:2017 | ISO/IEC 14882:2014 نوع : __cplusplus_cli تعریف شده برای ECMA-372 نوع : __embedded_cplusplus تعریف شده برای پلتفرم‌های امبد در Embedded C++ یک مثال از کاربرد استاندارد‌های C تحت ماکرو‌های از پیش تعریف شده: #if defined(__STDC__) # define PREDEF_STANDARD_C_1989 # if defined(__STDC_VERSION__) # if (__STDC_VERSION__ >= 199409L) # define PREDEF_STANDARD_C_1994 # endif # if (__STDC_VERSION__ >= 199901L) # define PREDEF_STANDARD_C_1999 # endif # endif #endif مثال‌های زیر برخی از ماکرو‌های از پیش تعریف شده در پلتفرم‌های مختلف را معرفی می‌کند. پلتفرم ویندوز‌ دسکتاپ (Windows) نوع : _WIN16 تعریف شده برای پلتفرم‌های ۱۶ بیتی نوع : _WIN32 تعریف شده برای پلتفرم‌های ۳۲ بیتی نوع : _WIN64 تعریف شده برای پلتفرم‌های ۶۴ بیتی نوع : __WIN32__ تعریف شده برای پلتفرم‌های ۳۲ بیتی توسط کامپایلر‌های Borland C++ نوع : __TOS_WIN__ تعریف شده برای پلتفرم‌های ویندوز توسط xlC نوع : __WINDOWS__ تعریف شده برای پلتفرم‌های ویندوز توسط Watcom C/C++ پلتفرم ویندوز‌ اِمبِد (Windows CE) نوع : _WIN32_WCE تعریف شده برای پلتفرم‌‌های ویندوز ۳۲ بیتی در اِِمبِد نوع : WIN32_PLATFORM_ تعریف شده توسط Embedded Visual Studio C++ پلتفرم یونیکس مکینتاش (Unix macOS) نوع : macintosh تعریف شده نسخه‌های macOS نوع : Macintosh تعریف شده برای نسخه‌های macOS نوع : __APPLE__ تعریف شده برای Mac OS X توسط GNU C and Intel C++ نوع : __MACH__ تعریف شده برای Mac OS X توسط GNU C and Intel C++ پلتفرم لینوکس - کرنل (Linux Kernel) نوع : __linux__ تعریف شده برای کرنل لینوکس نوع : linux تعریف شده برای کرنل لینوکس - منسوخ شده (سازگار نیست با POSIX) نوع : __linux تعریف شده برای کرنل لینوکس - منسوخ شده (سازگار نیست با POSIX) پلتفرم اندروید (Android) نوع : __ANDROID__ تعریف شده برای اندروید پلتفرم یونیکس بی‌اِ‌س‌دی (Unix BSD) نوع : __FreeBSD__ تعریف شده برای FreeBSD نوع : __NetBSD__ تعریف شده برای NetBSD نوع : __OpenBSD__ تعریف شده برای OpenBSD نوع : __bsdi__ تعریف شده برای BSDI نوع : __DragonFly__ تعریف شده برای Dragon Fly پلتفرم کیو‌اِن‌ایکس (QNX) نوع : __QNX__ تعریف شده برای نسخه‌های QNX 4.x نوع : __QNXNTO__ تعریف شده برای نسخه‌های QNX 4.x نکته : این مقاله ادامه دارد...
  24. فلسفه‌ی این ابزار این بود که شرکت کیوت یک ابزار مدرن‌تر و راحت‌تر نسبت به qmake بسازه تا بتونه با نحو‌ مشابه JavaScript مدیریتش کنه. من قبلاً توضیحاتی در رابطه با ویژگی‌ها و نحوه‌ی استفادش مقاله‌ای نوشتم بهش مراجعه کن.
  25. سلام، همانطور که می‌دانید شرکت Qt از سه نوع سیستم ساخت مختلف برای برنامه های Qt پشتیبانی می‌کند. برای کاربران کیوت، در حال حاضر qmake به طور گسترده استفاده می‌شود. CMake در حال محبوب شدن بوده و واضح است که به خوبی مورد استقبال قرار گرفته است. جایگاه سوم Qbs، با پذیرش قابل توجهی کوچکتر و کم اهمیت تر است (هرچند شرکت کیوت قبلاً اعلام کرده بود که این ابزار در نسخه‌ی ۶ کیوت به عنوان ابزار پیش‌فرض) ارائه خواهد شد. در یک نتیجه از آمار پرسش و سوال در مورد ابزار Qbs مشتریان این کمپانی به این نتیجه رسیده‌اند که مشتریان در آینده CMake و qmake را بر qbs ترجیح خواهند داد. بنابراین برای توسعه‌ی هرچه بیشتر دو ابزار قبلی از جمله CMake این شرکت تصمیم گرفته است تا منابع مرتبط با ابزار Qbs را از بین برده تا بتوانید به این صورت فرصت بهتری را برای افزایش کیفیت پشتیبانی از CMake را فراهم سازد. ابزار Qbs تا پایان سال ۲۰۱۹ همراه با نسخه‌ی ۴.۹ کیوت کریتور پشتیبانی خواهد شد. طبق گفته‌ی این کمپانی ابزار کیوبس تحت مجوز‌های تجاری و منبع باز است، بنابراین هرگونه حمایت جهت توسعه‌ی زیرساخت‌های آن را مورد حمایت نیز قرار می‌دهند. به هر حال حذف ان ابزار این اجازه را برای تیم پشتیبانی خواهد داد ت به طور قابل توجهی پشتیبانی در مورد CMake بهبود یابد.
×
×
  • جدید...