التقرير الفني الأول للغة 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 ]

المرافق العددية

توليد الأرقام العشوائية

الدوال الرياضية الخاصة

بعض ميزات TR1، مثل الدوال الرياضية الخاصة وبعض إضافات C99، غير مضمنة في تطبيق Visual C++ لـ TR1. لم يتم توحيد مكتبة الدوال الرياضية الخاصة في C++11.

  • إضافات إلى ملفات الرأس <cmath>/ - ، إلخ.<math.h>betalegendre

من المرجح أن تكون هذه الوظائف ذات أهمية رئيسية للمبرمجين في التخصصات الهندسية والعلمية.

يوضح الجدول التالي جميع الوظائف الخاصة الـ 23 الموضحة في TR1.

اسم الدالةنموذج الوظيفةالتعبير الرياضي
كثيرات الحدود لاجير المرتبطةdoubleassoc_laguerre(unsignedintn,unsignedintm,doublex);لنم(x)=(-1)مدمدxملن+م(x)، ل x0{\displaystyle {L_{n}}^{m}(x)=(-1)^{m}{\frac {d^{m}}{dx^{m}}}L_{n+m}(x),{\text{ لـ }}x\geq 0}
كثيرات حدود ليجندر المرتبطةdoubleassoc_legendre(unsignedintl,unsignedintm,doublex);Pلم(x)=(1-x2)م/2دمدxمPل(x)، ل x0{\displaystyle {P_{l}}^{m}(x)=(1-x^{2})^{m/2}{\frac {d^{m}}{dx^{m}}}P_{l}(x),{\text{ لـ }}x\geq 0}
دالة بيتاdoublebeta(doublex,doubley);ب(x،y)=Γ(x)Γ(y)Γ(x+y){\displaystyle \mathrm {B} (x,y)={\frac {\Gamma (x)\Gamma (y)}{\Gamma (x+y)}}}
التكامل الإهليلجي الكامل من النوع الأولdoublecomp_ellint_1(doublek);ك(ك)=F(ك،π2)=0π2دθ1-ك2الخطيئة2θ{\displaystyle K(k)=F\left(k,\textstyle {\frac {\pi }{2}}\right)=\int _{0}^{\frac {\pi }{2}}{\frac {d\theta }{\sqrt {1-k^{2}\sin ^{2}\theta }}}}
التكامل الإهليلجي الكامل من النوع الثانيdoublecomp_ellint_2(doublek);هـ(ك،π2)=0π21-ك2الخطيئة2θدθ{\displaystyle E\left(k,\textstyle {\frac {\pi }{2}}\right)=\int _{0}^{\frac {\pi }{2}}{\sqrt {1-k^{2}\sin ^{2}\theta }}\;d\theta }
التكامل الإهليلجي الكامل من النوع الثالثdoublecomp_ellint_3(doublek,doublenu);Π(ν،ك،π2)=0π2دθ(1-νالخطيئة2θ)1-ك2الخطيئة2θ$
الدوال الهندسية الفائقة المتقاربةdoubleconf_hyperg(doublea,doublec,doublex);F(أ،ج،x)=Γ(ج)Γ(أ)ن=0Γ(أ+ن)xنΓ(ج+ن)ن!{\displaystyle F(a,c,x)={\frac {\Gamma (c)}{\Gamma (a)}}\sum _{n=0}^{\infty }{\frac {\Gamma (a+n)x^{n}}{\Gamma (c+n)n!}}}
دوال بيسل الأسطوانية المعدلة المنتظمةdoublecyl_bessel_i(doublenu,doublex);أناν(x)=أنا-νجν(أناx)=ك=0(x/2)ν+2كك!Γ(ν+ك+1)، ل x0//
دوال بيسل الأسطوانية من النوع الأولdoublecyl_bessel_j(doublenu,doublex);جν(x)=ك=0(-1)ك(x/2)ν+2كك!Γ(ν+ك+1)، ل x0{\displaystyle J_{\nu }(x)=\sum _{k=0}^{\infty }{\frac {(-1)^{k}\;(x/2)^{\nu +2k}}{k!\;\Gamma (\nu +k+1)}},{\text{ for }}x\geq 0}
دوال بيسل الأسطوانية المعدلة غير المنتظمةdoublecyl_bessel_k(doublenu,doublex);كν(x)=π2أناν+1(جν(أناx)+أناشمالν(أناx))={أنا-ν(x)-أناν(x)الخطيئةνπ،ل x0 و νZπ2ليمμνأنا-μ(x)-أناμ(x)الخطيئةμπ،ل x<0 و νZ{\displaystyle {\begin{aligned}K_{\nu }(x)&=\textstyle {\frac {\pi }{2}}i^{\nu +1}{\big (}J_{\nu }(ix)+iN_{\nu }(ix){\big )}\\&={\begin{cases}\displaystyle {\frac {I_{-\nu }(x)-I_{\nu }(x)}{\sin \nu \pi }},&{\text{for }}x\geq 0{\text{ and }}\nu \notin \mathbb {Z} \\[10pt]\displaystyle {\frac {\pi }{2}}\lim _{\mu \to \nu }{\frac {I_{-\mu }(x)-I_{\mu }(x)}{\sin \mu \pi }},&{\text{for }}x<0{\text{ and }}\nu \in \mathbb {Z} \\\end{cases}}\end{aligned}}}
دوال نيومان الأسطوانية

دوال بيسل الأسطوانية من النوع الثاني

doublecyl_neumann(doublenu,doublex);شمالν(x)={جν(x)كوسνπ-ج-ν(x)الخطيئةνπ،ل x0 و νZليمμνجμ(x)كوسμπ-ج-μ(x)الخطيئةμπ،ل x<0 و νZ{\displaystyle N_{\nu }(x)={\begin{cases}\displaystyle {\frac {J_{\nu }(x)\cos \nu \pi -J_{-\nu }(x)}{\sin \nu \pi }},&{\text{for }}x\geq 0{\text{ and }}\nu \notin \mathbb {Z} \\[10pt]\displaystyle \lim _{\mu \to \nu }{\frac {J_{\mu }(x)\cos \mu \pi -J_{-\mu }(x)}{\sin \mu \pi }},&{\text{for }}x<0{\text{ and }}\nu \in \mathbb {Z} \\\end{cases}}}
التكامل الإهليلجي غير الكامل من النوع الأولdoubleellint_1(doublek,doublephi);F(ك،ϕ)=0ϕدθ1-ك2الخطيئة2θ، ل |ك|1{\displaystyle F(k,\phi )=\int _{0}^{\phi }{\frac {d\theta }{\sqrt {1-k^{2}\sin ^{2}\theta }}},{\text{ for }}\left|k\right|\leq 1}
التكامل الإهليلجي غير الكامل من النوع الثانيdoubleellint_2(doublek,doublephi);هـ(ك،ϕ)=0ϕ1-ك2الخطيئة2θدθ، ل |ك|1{\displaystyle \displaystyle E(k,\phi )=\int _{0}^{\phi }{\sqrt {1-k^{2}\sin ^{2}\theta }}d\theta ,{\text{ for }}\left|k\right|\leq 1}
التكامل الإهليلجي غير الكامل من النوع الثالثdoubleellint_3(doublek,doublenu,doublephi);Π(ك،ν،ϕ)=0ϕدθ(1-νالخطيئة2θ)1-ك2الخطيئة2θ، ل |ك|1{\displaystyle \Pi (k,\nu ,\phi )=\int _{0}^{\phi }{\frac {d\theta }{\left(1-\nu \sin ^{2}\theta \right){\sqrt {1-k^{2}\sin ^{2}\theta }}}},{\text{ for }}\left|k\right|\leq 1}
التكامل الأسيdoubleexpint(doublex);هـأنا(x)=--xهـ-تتدت{\displaystyle {\mbox{E}}i(x)=-\int _{-x}^{\infty }{\frac {e^{-t}}{t}}\,dt}
كثيرات حدود هيرميتdoublehermite(unsignedintn,doublex);حن(x)=(-1)نهـx2دندxنهـ-x2{\displaystyle H_{n}(x)=(-1)^{n}e^{x^{2}}{\frac {d^{n}}{dx^{n}}}e^{-x^{2}}\,\!}
متسلسلة فرط هندسيةdoublehyperg(doublea,doubleb,doublec,doublex);F(أ،ب،ج،x)=Γ(ج)Γ(أ)Γ(ب)ن=0Γ(أ+ن)Γ(ب+ن)Γ(ج+ن)xنن!{\displaystyle F(a,b,c,x)={\frac {\Gamma (c)}{\Gamma (a)\Gamma (b)}}\sum _{n=0}^{\infty }{\frac {\Gamma (a+n)\Gamma (b+n)}{\Gamma (c+n)}}{\frac {x^{n}}{n!}}}
كثيرات حدود لاغيرdoublelaguerre(unsignedintn,doublex);لن(x)=هـxن!دندxن(xنهـ-x)، ل x0{\displaystyle L_{n}(x)={\frac {e^{x}}{n!}}{\frac {d^{n}}{dx^{n}}}\left(x^{n}e^{-x}\right),{\text{ for }}x\geq 0}
كثيرات حدود ليجندرdoublelegendre(unsignedintl,doublex);Pل(x)=12لل!دلدxل(x2-1)ل، ل |x|1{\displaystyle P_{l}(x)={1 \over 2^{l}l!}{d^{l} \over dx^{l}}(x^{2}-1)^{l},{\text{ for }}\left|x\right|\leq 1}
دالة زيتا لريمانdoubleriemann_zeta(doublex);Z(x)={ك=1ك-x،ل x>12xπx-1الخطيئة(xπ2)Γ(1-x)ζ(1-x)،ل x<1{\displaystyle \mathrm {Z} (x)={\begin{cases}\displaystyle \sum _{k=1}^{\infty }k^{-x},&{\text{for }}x>1\\[10pt]\displaystyle 2^{x}\pi ^{x-1}\sin \left({\frac {x\pi }{2}}\right)\Gamma (1-x)\zeta (1-x),&{\text{for }}x<1\\\end{cases}}}
دوال بيسل الكروية من النوع الأولdoublesph_bessel(unsignedintn,doublex);جن(x)=π2xجن+1/2(x)، ل x0{\displaystyle j_{n}(x)={\sqrt {\frac {\pi }{2x}}}J_{n+1/2}(x),{\text{ for }}x\geq 0}
دوال ليجندر الكروية المرتبطةdoublesph_legendre(unsignedintl,unsignedintm,doubletheta);Yلم(θ،0) أين Yلم(θ،ϕ)=(-1)م[(2ل+1)4π(ل-م)!(ل+م)!]12Pلم(كوسθ)هـأنامϕ، ل |م|ل{\displaystyle Y_{l}^{m}(\theta ,0){\text{ where }}Y_{l}^{m}(\theta ,\phi )=(-1)^{m}\left[{\frac {(2l+1)}{4\pi }}{\frac {(l-m)!}{(l+m)!}}\right]^{1 \over 2}P_{l}^{m}(\cos \theta )e^{\mathrm {i} m\phi },{\text{ for }}|m|\leq l}
دوال نيومان الكروية

دوال بيسل الكروية من النوع الثاني

doublesph_neumann(unsignedintn,doublex);نن(x)=(π2x)12شمالن+12(x)، ل x0{\displaystyle n_{n}(x)=\left({\frac {\pi }{2x}}\right)^{\frac {1}{2}}N_{n+{\frac {1}{2}}}(x),{\text{ for }}x\geq 0}

لكل دالة شكلان إضافيان. إضافة اللاحقة ' 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 .

تضمنت بعض المقترحات ما يلي:

بعد إصدار دعوة لتقديم مقترحات بشأن TR2، تم تغيير إجراءات المنظمة الدولية للتوحيد القياسي (ISO)، لذا لن يكون هناك TR2. وبدلاً من ذلك، سيتم نشر تحسينات على لغة C++ في عدد من المواصفات الفنية. بعض المقترحات المذكورة أعلاه مُدرجة بالفعل في معيار C++ أو في مسودات المواصفات الفنية.

انظر أيضاً

  • C++11 ، معيار لغة البرمجة C++؛ استندت تحسينات المكتبة إلى TR1
  • C11 (مراجعة معيار C) ، وهي مراجعة لمعيار C تتضمن بعض الميزات المقترحة في TR1
  • مكتبة Boost ، وهي مجموعة كبيرة من مكتبات C++ المحمولة، وقد تم تضمين العديد منها في TR1
  • مكتبة القوالب القياسية ، وهي جزء من مكتبة C++ القياسية الحالية

مراجع

  1. "ref - 1.72.0" . www.boost.org .
  2. "Boost.SmartPtr: مكتبة المؤشرات الذكية - 1.72.0" . www.boost.org .
  3. "الفصل 16. Boost.Function - 1.72.0" . www.boost.org .
  4. "الفصل 1. Boost.Bind - 1.72.0" . www.boost.org .
  5. "الفصل 1. دالة Boost.Member - 1.72.0" . www.boost.org .
  6. "الفصل 1. Boost.TypeTraits - 1.37.0" . www.boost.org .
  7. "مكتبة Boost Tuple - Boost 1.48.0" . مؤرشفة من الأصل بتاريخ 26-05-2006 . تم الاطلاع عليها بتاريخ 27-05-2006 .
  8. "الفصل 5. Boost.Array - 1.72.0" . www.boost.org .
  9. "Boost.Regex - 1.36.0" . www.boost.org .

مصادر