التقرير الفني الأول للغة C++
التقرير الفني الأول للغة C++ ( TR1 ) هو الاسم الشائع للوثيقة ISO/IEC TR 19768، بعنوان "امتدادات مكتبة C++" ، وهي وثيقة اقترحت إضافات إلى مكتبة C++ القياسية لمعيار لغة C++03 . تشمل هذه الإضافات التعابير النمطية ، والمؤشرات الذكية ، وجداول التجزئة ، ومولدات الأرقام العشوائية . لم يكن TR1 معيارًا بحد ذاته، بل كان مسودة وثيقة. مع ذلك، أصبحت معظم مقترحاته جزءًا من المعيار الرسمي اللاحق، C++11 . قبل اعتماد C++11 كمعيار، استخدم الموردون هذه الوثيقة كدليل لإنشاء الامتدادات. كان هدف التقرير هو "بناء ممارسات قائمة أكثر انتشارًا لمكتبة C++ القياسية الموسعة".
تم تعميم التقرير لأول مرة في شكل مسودة في عام 2005 كمسودة تقرير فني حول ملحقات مكتبة C++ ، ثم تم نشره في عام 2007 كمعيار ISO/IEC باسم ISO/IEC TR 19768:2007 .
ملخص
لم تكن المترجمات بحاجة إلى تضمين مكونات TR1 للامتثال لمعيار C++، لأن مقترحات TR1 لم تكن جزءًا من المعيار نفسه، بل مجرد مجموعة من الإضافات المحتملة التي كانت لا تزال قيد التصديق. مع ذلك، كان معظم TR1 متاحًا من Boost ، وقام العديد من موزعي المترجمات/المكتبات بتنفيذ جميع المكونات أو بعضها. لا تمثل TR1 القائمة الكاملة للإضافات التي ظهرت في C++11 . على سبيل المثال، يتضمن C++11 مكتبة دعم الخيوط غير متوفرة في TR1.
تم تعريف المكونات الجديدة في std::tr1مساحة الاسم لتمييزها عن المكتبة القياسية الحالية آنذاك.
عناصر
يتضمن TR1 المكونات التالية:
المرافق العامة
مُغلِّف المراجع – يُتيح تمرير المراجع ، بدلاً من النسخ، إلى الخوارزميات أو كائنات الدوال. استندت هذه الميزة إلى مكتبة Boost.Ref. [ 1 ] يُستَحصَل على مرجع المُغلِّف من نسخة من فئة القالب reference_wrapper. تُشبه مراجع المُغلِّف المراجع العادية ('&') في لغة C++. للحصول على مرجع مُغلِّف من أي كائن، refتُستخدم فئة القالب (أما للحصول على مرجع ثابت، crefفيُستَحصَل عليه من مرجع ثابت).
تُعد المراجع المُغلِّفة مفيدة بشكل خاص لوظائف القوالب، عندما لا يستنتج استنتاج الوسيط مرجعًا (على سبيل المثال عند تمرير الوسائط):
#include <iostream> #include <tr1/functional>void f ( int & r ) { ++ r ; }template < class Func , class Arg > void g ( Func f , Arg t ) { f ( t ); }int main () { int i = 0 ;g ( f , i ); // تم إنشاء نسخة من 'g<void(int& r), int>' std :: cout << i << " \n " ; // الناتج: 0g ( f , std :: tr1 :: ref ( i )); // تم إنشاء نسخة من 'g<void(int& r), std::tr1::reference_wrapper<int>>' std :: cout << i << " \n " ; // الناتج: 1 }المؤشرات الذكية – تضيف عدة فئات تُسهّل إدارة دورة حياة الكائنات في الحالات المعقدة. تمت إضافة ثلاث فئات رئيسية:
shared_ptr– مؤشر ذكي مع عد المراجعweak_ptr– أحد المتغيراتshared_ptrالتي لا تزيد من عدد المراجع
يعتمد هذا المقترح على مكتبة Boost Smart Pointer. [ 2 ]
كائنات الوظائف
تُضاف هذه الوحدات الأربع إلى <functional>ملف الرأس:
مُغلِّف الدوال متعددة الأشكال ( function) – يُمكنه تخزين أي دالة قابلة للاستدعاء (مؤشرات الدوال، ومؤشرات دوال الأعضاء، وكائنات الدوال) التي تستخدم توقيع استدعاء دالة مُحدد. لا يعتمد النوع على نوع الدالة القابلة للاستدعاء المُستخدمة. مُستند إلى Boost.Function [ 3 ]
روابط كائنات الدوال ( bind) – يمكنها ربط أي معلمات بكائنات الدوال. كما يُسمح بتركيب الدوال. هذه نسخة معممة من الدوال القياسية std::bind1stودوال std::bind2ndالربط. تعتمد هذه الميزة على مكتبة Boost Bind. [ 4 ]
أنواع إرجاع الدالة ( result_of) – تحدد نوع تعبير الاستدعاء.
الدوال الأعضاء ( mem_fn) – تحسين للدوال القياسية std::mem_fun. std::mem_fun_refيسمح بمعاملة المؤشرات إلى الدوال الأعضاء ككائنات دوال. يعتمد على مكتبة Boost Mem Fn. [ 5 ]
البرمجة الفوقية وسمات النوع
يوجد الآن <type_traits>ملف رأس يحتوي على العديد من قوالب السمات الوصفية المفيدة، مثل is_podو has_virtual_destructorو remove_extentو وما إلى ذلك. يُسهّل هذا الملف برمجة السمات الوصفية من خلال تمكين الاستعلامات والتحويل بين الأنواع المختلفة . يعتمد هذا المقترح على مكتبة Boost Type Traits. [ 6 ]
المرافق العددية
توليد الأرقام العشوائية
<random>ملف رأس جديد –variate_generator,mersenne_twister,poisson_distribution, إلخ.- أدوات لتوليد أرقام عشوائية باستخدام أي من مولدات الأرقام العشوائية الزائفة ، والمحركات، وتوزيعات الاحتمالات.
الدوال الرياضية الخاصة
بعض ميزات TR1، مثل الدوال الرياضية الخاصة وبعض إضافات C99، غير مضمنة في تطبيق Visual C++ لـ TR1. لم يتم توحيد مكتبة الدوال الرياضية الخاصة في C++11.
من المرجح أن تكون هذه الوظائف ذات أهمية رئيسية للمبرمجين في التخصصات الهندسية والعلمية.
يوضح الجدول التالي جميع الوظائف الخاصة الـ 23 الموضحة في TR1.
| اسم الدالة | نموذج الوظيفة | التعبير الرياضي |
|---|---|---|
| كثيرات الحدود لاجير المرتبطة | doubleassoc_laguerre(unsignedintn,unsignedintm,doublex); | |
| كثيرات حدود ليجندر المرتبطة | doubleassoc_legendre(unsignedintl,unsignedintm,doublex); | |
| دالة بيتا | doublebeta(doublex,doubley); | |
| التكامل الإهليلجي الكامل من النوع الأول | doublecomp_ellint_1(doublek); | |
| التكامل الإهليلجي الكامل من النوع الثاني | doublecomp_ellint_2(doublek); | |
| التكامل الإهليلجي الكامل من النوع الثالث | doublecomp_ellint_3(doublek,doublenu); | |
| الدوال الهندسية الفائقة المتقاربة | doubleconf_hyperg(doublea,doublec,doublex); | |
| دوال بيسل الأسطوانية المعدلة المنتظمة | doublecyl_bessel_i(doublenu,doublex); | |
| دوال بيسل الأسطوانية من النوع الأول | doublecyl_bessel_j(doublenu,doublex); | |
| دوال بيسل الأسطوانية المعدلة غير المنتظمة | doublecyl_bessel_k(doublenu,doublex); | |
| دوال نيومان الأسطوانية | doublecyl_neumann(doublenu,doublex); | |
| التكامل الإهليلجي غير الكامل من النوع الأول | doubleellint_1(doublek,doublephi); | |
| التكامل الإهليلجي غير الكامل من النوع الثاني | doubleellint_2(doublek,doublephi); | |
| التكامل الإهليلجي غير الكامل من النوع الثالث | doubleellint_3(doublek,doublenu,doublephi); | |
| التكامل الأسي | doubleexpint(doublex); | |
| كثيرات حدود هيرميت | doublehermite(unsignedintn,doublex); | |
| متسلسلة فرط هندسية | doublehyperg(doublea,doubleb,doublec,doublex); | |
| كثيرات حدود لاغير | doublelaguerre(unsignedintn,doublex); | |
| كثيرات حدود ليجندر | doublelegendre(unsignedintl,doublex); | |
| دالة زيتا لريمان | doubleriemann_zeta(doublex); | |
| دوال بيسل الكروية من النوع الأول | doublesph_bessel(unsignedintn,doublex); | |
| دوال ليجندر الكروية المرتبطة | doublesph_legendre(unsignedintl,unsignedintm,doubletheta); | |
| دوال نيومان الكروية | doublesph_neumann(unsignedintn,doublex); |
لكل دالة شكلان إضافيان. إضافة اللاحقة ' f ' أو ' l ' إلى اسم الدالة يُعطي دالة تعمل على floatقيم 'f long double' أو 'l' على التوالي. على سبيل المثال:
float sph_neumannf ( unsigned int n , float x ); long double sph_neumannl ( unsigned int n , long double x );حاويات
أنواع الصفوف
<tuple>ملف رأس جديد –tuple- استنادًا إلى مكتبة Boost Tuple [ 7 ]
- امتداد غامض للمعيار
std::pair - مجموعة عناصر ذات حجم ثابت، والتي قد تكون من أنواع مختلفة
مصفوفة ذات حجم ثابت
<array>ملف رأس جديد –array- مأخوذ من مكتبة Boost Array [ 8 ]
- على عكس أنواع المصفوفات الديناميكية مثل النوع القياسي
std::vector
جداول التجزئة
<unordered_set>ملفات رأسية جديدة<unordered_map>- يقومون بتنفيذ الفئات
unordered_set،unordered_multiset، ،unordered_mapو ،unordered_multimapعلى غرارset،multiset،map، وmultimap، على التوالي- لسوء الحظ،
unordered_setلاunordered_multisetيمكن استخدامها معset_unionوظائف المكتبةset_intersectionالقياسية ، والتي تعمل معset_differenceset_symmetric_differenceincludessetmultiset
- لسوء الحظ،
- تطبيق جديد، غير مشتق من مكتبة موجودة، وغير متوافق تمامًا مع واجهة برمجة التطبيقات الخاصة بالمكتبات الموجودة
- مثل جميع جداول التجزئة ، غالبًا ما توفر بحثًا ثابتًا عن العناصر، ولكن أسوأ حالة يمكن أن تكون خطية في حجم الحاوية
التعبيرات النمطية
<regex>ملف رأس جديد –regex,regex_match,regex_search,regex_replace, إلخ.- يعتمد على مكتبة Boost RegEx [ 9 ]
- مكتبة مطابقة الأنماط
التوافق مع لغة C
صُممت لغة C++ لتكون متوافقة مع لغة البرمجة C ، ولكنها ليست مجموعة شاملة تمامًا للغة C نظرًا لاختلاف المعايير. يحاول TR1 التوفيق بين بعض هذه الاختلافات من خلال إضافات إلى ملفات رأسية مختلفة في مكتبة C++، مثل <complex> و<locale> و<cmath>، إلخ. تُساعد هذه التغييرات على جعل C++ أكثر توافقًا مع إصدار C99 من معيار C (لا تتضمن TR1 جميع أجزاء C99).
التقرير الفني 2
في عام ٢٠٠٥، طُرح طلبٌ لتقديم مقترحاتٍ لمشروع TR2 مع اهتمامٍ خاصٍّ بتقنيات يونيكود، وXML/HTML، والشبكات، وسهولة الاستخدام للمبرمجين المبتدئين. دعوة لتقديم مقترحات TR2 .
تضمنت بعض المقترحات ما يلي:
- الخيوط
- مكتبة Asio C++ (الشبكات)).
- الإشارات/الفتحات [ sigc ] اقتراح للتوحيد القياسي في مكتبة C++ TR2
- مكتبة نظام الملفات لـ TR2 - تعتمد على مكتبة نظام الملفات Boost، للاستعلام عن المسارات والملفات والمجلدات ومعالجتها.
- دعم أي مكتبة: مقترح لأي مكتبة لـ TR2
- مكتبة التحويل المعجمي - اقتراح مكتبة التحويل لـ TR2
- اقتراح خوارزميات جديدة للسلاسل النصية في TR2
- نحو تصنيف أكثر شمولاً للخصائص الجبرية للمكتبات العددية في TR2 ISO/IEC JTC1/SC22/WG21 - أوراق 2008
- إضافة خاصية البحث عن مقارنة غير متجانسة إلى الحاويات الترابطية لـ TR2
بعد إصدار دعوة لتقديم مقترحات بشأن TR2، تم تغيير إجراءات المنظمة الدولية للتوحيد القياسي (ISO)، لذا لن يكون هناك TR2. وبدلاً من ذلك، سيتم نشر تحسينات على لغة C++ في عدد من المواصفات الفنية. بعض المقترحات المذكورة أعلاه مُدرجة بالفعل في معيار C++ أو في مسودات المواصفات الفنية.
انظر أيضاً
- C++11 ، معيار لغة البرمجة C++؛ استندت تحسينات المكتبة إلى TR1
- C11 (مراجعة معيار C) ، وهي مراجعة لمعيار C تتضمن بعض الميزات المقترحة في TR1
- مكتبة Boost ، وهي مجموعة كبيرة من مكتبات C++ المحمولة، وقد تم تضمين العديد منها في TR1
- مكتبة القوالب القياسية ، وهي جزء من مكتبة C++ القياسية الحالية
مراجع
- ↑ "ref - 1.72.0" . www.boost.org .
- ↑ "Boost.SmartPtr: مكتبة المؤشرات الذكية - 1.72.0" . www.boost.org .
- ↑ "الفصل 16. Boost.Function - 1.72.0" . www.boost.org .
- ↑ "الفصل 1. Boost.Bind - 1.72.0" . www.boost.org .
- ↑ "الفصل 1. دالة Boost.Member - 1.72.0" . www.boost.org .
- ↑ "الفصل 1. Boost.TypeTraits - 1.37.0" . www.boost.org .
- ↑ "مكتبة Boost Tuple - Boost 1.48.0" . مؤرشفة من الأصل بتاريخ 26-05-2006 . تم الاطلاع عليها بتاريخ 27-05-2006 .
- ↑ "الفصل 5. Boost.Array - 1.72.0" . www.boost.org .
- ↑ "Boost.Regex - 1.36.0" . www.boost.org .
مصادر
- ISO/IEC JTC1/SC22/WG21 — مسودة تقرير فني حول ملحقات مكتبة C++ (PDF) (تقرير). 24-06-2005.
- ISO/IEC TR 19768:2007 — تكنولوجيا المعلومات — لغات البرمجة — تقرير فني حول ملحقات مكتبة C++ (تقرير). نوفمبر 2007.
- بيكر، بيتر (2006). ملحقات مكتبة C++ القياسية: دليل تعليمي ومرجع . أديسون-ويسلي بروفيشنال. ISBN 0-321-41299-0.
روابط خارجية
- يحتوي كتاب سكوت مايرز "Effective C++: TR1 Information " على روابط لوثائق مقترح TR1 التي توفر معلومات أساسية ومبررات لمكتبات TR1.
- مكتبة C++ القياسية
