گزارش فنی ۱ سیپلاسپلاس
گزارش فنی ۱ سیپلاسپلاس (به انگلیسی: C++ Technical Report 1 (TR1)) نام رایج ISO/IEC TR 19768، C++ Library Extensions است، که درواقع سندی است که اضافاتی را به کتابخانه استاندارد سیپلاسپلاس برای استاندارد C++03 پیشنهاد میکند. این اضافات، شامل عبارات باقاعده، اشارهگرهای هوشمند، جداول درهمکسازی و مولدهای اعداد شبهتصادفی است. TR1 خودش یک استاندارد نبود، بلکه یک سند پیشنویس بود. با این حال، بیشتر پیشنهادهای آن، بخشی از استاندارد رسمی بعدی، C++11 شد. قبل از استانداردسازی C++11، سازندگان از این سند به عنوان راهنما برای ایجاد اکستنشنها استفاده میکردند. هدف این گزارش «ایجاد شیوههای موجود برای گستردهترسازی کتابخانه استاندارد سیپلاسپلاس» بود.
این گزارش برای اولین بار به صورت پیشنویس در سال ۲۰۰۵ به عنوان پیشنویس گزارش فنی در مورد پسوندهای کتابخانه سیپلاسپلاس منتشر شد، سپس در سال ۲۰۰۷ تحت استاندارد ISO/IEC به عنوان ISO/IEC TR 19768:2007 منتشر گردید.
بررسی اجمالی
[ویرایش]کامپایلرها برای انطباق با استاندارد سیپلاسپلاس نیازی به گنجاندن اجزای گزارش فنی ۱ نداشتند، زیرا پیشنهادهای TR1 بخشی از خود استاندارد نبودند، فقط مجموعهای از اضافات احتمالی بودند که باید تأیید میشدند. با این حال، بیشتر TR1 در کتابخانه بوست در دسترس قرار داشت و چندین توزیعکننده کامپایلر/کتابخانه همه یا برخی از مؤلفههای TR1 را پیادهسازی کرده بودند. TR1 لیست کاملی از موارد اضافهشده به C++11 نیست. به عنوان مثال، C++11 شامل یک کتابخانه پشتیبانی Thread است که در TR1 موجود نیست.
اجزای جدید در فضای نام std::tr1
تعریف شدند تا آنها را از کتابخانه استاندارد فعلی متمایز کند.
اجزاء
[ویرایش]گزارش فنی ۱ شامل اجزای زیر است:
خدمات عمومی
[ویرایش]الگوی آداپتور رفرنس – انتقال ارجاعات را به جای کپی، در الگوریتمها یا اشیاء تابع فعال میکند. این ویژگی مبتنی بر کتابخانه Boost.Ref بود.[۱] یک الگوی آداپتور مرجع از نمونهای از قالب-کلاس reference_wrapper
به دست میآید. الگوی آداپتور مراجع، مشابه مراجع معمولی ('&') زبان ++C هستند. برای بهدست آوردن یک الگوی آداپتور مرجع از هر شی از قالب-کلاس ref
استفاده میشود (برای cref
از مرجع ثابت استفاده میشود).
ارجاعات Wrapper، بیش از همه برای قالب-توابع مفید هستند، زمانی که کسر آرگومان، مرجعی را استنتاج نمیکند (مثلاً هنگام ارسال آرگومانها):
#include <iostream>
#include <tr1/functional>
void f(int &r){ ++r; }
template <class Funct, class Arg>
void g(Funct f, Arg t)
{
f(t);
}
int main()
{
int i = 0;
g(f, i); // 'g< void(int &r), int >' is instantiated
std::cout << i << "\n"; // Output: 0
g(f, std::tr1::ref(i)); // 'g< void(int &r), reference_wrapper<int> >' is instanced
std::cout << i << "\n"; // Output: 1
}
اشارهگرهای هوشمند - چندین کلاس را اضافه میکند که مدیریت طول عمر شیء را در موارد پیچیده ساده میکند. سه کلاس اصلی اضافه شدهاست:
shared_ptr
- یک اشارهگر هوشمند با شمارشگر مرجعweak_ptr
– گونهای ازshared_ptr
که تعداد مراجع را افزایش نمیدهد
این پروپوزال بر اساس کتابخانه Boost Smart Point میباشد.[۲]
اشیاء تابع
[ویرایش]این چهار ماژول به فایل سربرگ <functional>
اضافه شدند:
بستهبندی تابع چندریختی (function
) - میتواند هر تابع قابل فراخوانی (اشارهگر تابع، اشارهگر تابع عضو و اشیاء تابع) را که از امضای فراخوانی تابع مشخصی استفاده میکند، ذخیره کند. تایپ، به نوع فراخوانی موردنظر بستگی ندارد. بر اساس Boost.Function[۳]
بایندرهای شی تابع (bind
) - هر پارامتر میتواند پارامترهایی را به اشیاء تابع متصل کند. ترکیب تابع نیز مجاز است. این مورد، یک نسخه کلی از توابع استاندارد std::bind1st
و std::bind2nd
bind است. این ویژگی بر اساس کتابخانه Boost Bind پیشنهاد داده شد.[۴]
انواع بازگشتی تابع (result_of
) - نوع عبارت فراخوانی را تعیین میکند.
توابع عضو (mem_fn
) – بعداً به انواع استاندارد std::mem_fun
و std::mem_fun_ref
ارتقاء داده شد. به اشارهگرهای توابع عضو اجازه میدهد تا به عنوان اشیاء تابع در نظر گرفته شوند. بر اساس کتابخانه Boost Mem Fn.[۵]
متاپروگرمینگ و ویژگیهای نوع
[ویرایش]اکنون فایل سربرگ <type_traits>
وجود دارد که حاوی بسیاری از متا-قالبهای صفتی مفید است، مانند is_pod
، has_virtual_destructor
، remove_extent
و…. این قابلیت با فعالکردن پرسوجوها و تبدیل بین انواع مختلف، متاپروگرمینگ را آسان مینماید. این پیشنهاد براساس کتابخانه Boost Type Traits است.[۶]
امکانات عددی
[ویرایش]تولید اعداد تصادفی
[ویرایش]- فایل هدر
<random>
جدید –variate_generator
،mersenne_twister
،poisson_distribution
، و… - ابزارهایی برای تولید اعداد تصادفی با استفاده از هریک از چندین مولد اعداد شبهتصادفی، موتورها و توزیعهای احتمال
توابع ویژه ریاضی
[ویرایش]برخی از ویژگیهای TR1، مانند توابع ویژه ریاضی و برخی از اضافات C99، در پیادهسازی Visual C++ TR1 گنجانده نشدهاند. کتابخانه توابع ویژه ریاضی در C++11 استانداردسازی نشده بود.
این توابع احتمالاً مورد توجه برنامهنویسان در رشتههای مهندسی و علمی قرار خواهند گرفت.
جدول زیر تمام ۲۳ عملکرد ویژه توصیف شده در TR1 را نشان میدهد.
نام تابع | نمونه اولیه تابع | تعریف ریاضیاتی |
---|---|---|
چندجملهایهای لاگر مرتبط | double assoc_laguerre( unsigned n, unsigned m, double x ) ;
|
|
توابع وابسته لژاندر | double assoc_legendre(unsigned l, unsigned m, double x) ;
|
|
تابع بتا | double beta(double x, double y) ;
|
|
نوع اول انتگرال بیضوی | double comp_ellint_1(double k) ;
|
|
نوع دوم انتگرال بیضوی | double comp_ellint_2(double k) ;
|
|
نوع سوم انتگرال بیضوی | double comp_ellint_3(double k, double nu) ;
|
|
توابع فراهندسی متقابل | double conf_hyperg(double a, double c, double x) ;
|
|
توابع منظم استوانهای اصلاح شده بسل | double cyl_bessel_i(double nu, double x) ;
|
|
نوع اول توابع استوانهای بسل | double cyl_bessel_j(double nu, double x) ;
|
|
توابع نامنظم استوانهای اصلاح شده بسل | double cyl_bessel_k(double nu, double x) ;
|
|
توابع نویمان استوانهای | double cyl_neumann(double nu, double x) ;
|
|
نوع اول انتگرال بیضوی ناقص | double ellint_1(double k, double phi) ;
|
|
نوع دوم انتگرال بیضوی ناقص | double ellint_2(double k, double phi) ;
|
|
نوع سوم انتگرال بیضوی ناقص | double ellint_3(double k, double nu, double phi) ;
|
|
انتگرال نمایی | double expint(double x) ;
|
|
چندجملهایهای هرمیت | double hermite(unsigned n, double x) ;
|
|
سری فوق هندسی | double hyperg(double a, double b, double c, double x) ;
|
|
چندجملهایهای لاگر | double laguerre(unsigned n, double x) ;
|
|
چندجملهایهای لژاندر | double legendre(unsigned l, double x) ;
|
|
تابع زتای ریمان | double riemann_zeta(double x) ;
|
|
نوع اول از توابع بسل کروی | double sph_bessel(unsigned n, double x) ;
|
|
توابع وابسته کروی لژاندر | double sph_legendre(unsigned l, unsigned m, double theta) ;
|
|
توابع کروی نویمان | double sph_neumann(unsigned n, double x) ;
|
هر تابع دو نوع دیگر دارد. اضافه کردن پسوند " f " یا " l " به نام تابع، تابعی را به دست میدهد که به ترتیب بر روی مقادیر long double
float
یا طولانی عمل میکند. مثلا:
float sph_neumannf(unsigned n, float x) ;
long double sph_neumannl(unsigned n, long double x) ;
ظروف
[ویرایش]انواع تاپل
[ویرایش]- فایل سربرگ جدید
<tuple>
- بر اساس کتابخانه Boost Tuple[۷]
- بهطور مبهم یک اکستنشن استاندارد
std::pair
است - مجموعه عناصر با اندازه ثابت که ممکن است انواع مختلفی داشته باشند
آرایه با اندازه ثابت
[ویرایش]- فایل سربرگ
<array>
جدید –array
- برگرفته از کتابخانه Boost Array[۸]
- برخلاف انواع آرایه پویا مانند
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_difference
،set_symmetric_difference
استفاده کرد وincludes
توابع کتابخانه استاندارد است که برایset
وmultiset
کار میکند.
- متأسفانه،
- پیادهسازی جدید، از کتابخانه خاصی مشتق نشدهاست، API بهطور کامل با کتابخانههای موجود سازگار نیست
- مانند همه جداول هش، اغلب جستجوی زمان ثابت عناصر را ارائه میدهند، اما بدترین حالت میتواند در اندازه ظرف خطی باشد.
عبارات باقاعده
[ویرایش]- فایل هدر
<regex>
جدید –regex
،regex_match
،regex_search
،regex_replace
، و… - بر اساس کتابخانه Boost RegEx[۹]
- کتابخانه تطبیق الگو
سازگاری با C
[ویرایش]سیپلاسپلاس به گونهای طراحی شدهاست که با زبان برنامهنویسی C سازگار باشد، اما به دلیل استانداردهای متفاوت، زیرمجموعه خاصی از C نیست. TR1 سعی میکند برخی از این تفاوتها را از طریق افزودن سرصفحههای مختلف در کتابخانه سیپلاسپلاس، مانند <complex>، <locale>، <cmath> و… تطبیق دهد. این تغییرات به تطابق بیشتر سیپلاسپلاس با نسخه C99 استاندارد C کمک میکند (همه قسمتهای C99 در TR1 گنجانده نشدهاند).
گزارش فنی ۲
[ویرایش]در سال ۲۰۰۵، درخواستی برای پیشنهادها برای یک TR2 با تمرکز ویژه بر روی Unicode, XML/HTML، شبکه و قابلیت استفاده برای برنامهنویسان تازهکار انجام شد. فراخوان TR2 برای پروپوزالها
برخی از پیشنهادها شامل اینها بودند:
- نخها
- کتابخانه Asio (شبکه).
- سیگنال/اسلات - [پیشنهاد sigc برای استانداردسازی در کتابخانه C++ TR2]
- کتابخانه فایلسیستم - کتابخانه فایلسیستم برای TR2 – بر اساس کتابخانه بوست سیستمفایل، برای پرسوجو/ دستکاری مسیرها، فایلها و دایرکتوریها.
- کتابخانه Boost Any - پیشنهاد کتابخانه Boost Any برای TR2
- کتابخانه تبدیل واژگانی برای TR2
- الگوریتمهای رشتهای جدید در TR2
- به سوی تاکسونومی کاملتر از ویژگیهای جبری برای کتابخانههای عددی در TR2 ISO/IEC JTC1/SC22/WG21 - مقالات ۲۰۰۸
- افزودن جستجوی مقایسه ناهمگن به ظروف associative برای TR2
پس از صدور فراخوان برای پیشنهادهای TR2، رویههای ISO تغییر کرد، بنابراین TR2 وجود نخواهد داشت. در عوض، بهبودهای سیپلاسپلاس در تعدادی از مشخصات فنی منتشر خواهد شد. برخی از پیشنهادهای ذکر شده در بالا قبلاً در استاندارد سیپلاسپلاس یا در نسخههای پیشنویس مشخصات فنی گنجانده شدهاند.
جستارهای وابسته
[ویرایش]- C++11، یکی از استانداردهای زبان سیپلاسپلاس. بهبود کتابخانه بر اساس TR1 بود
- C11 (نسخه استاندارد C)، نسخه سابق استاندارد برای زبان برنامهنویسی C
- کتابخانه بوست، مجموعه بزرگی از کتابخانههای سیپلاسپلاس قابل حمل، که چندین مورد از آنها در TR1 گنجانده شدهاست
- کتابخانه استاندارد قالب، بخشی از کتابخانه استاندارد فعلی سیپلاسپلاس
منابع
[ویرایش]- ↑ "ref - 1.72.0". www.boost.org.
- ↑ "Boost.SmartPtr: The Smart Pointer Library - 1.72.0". www.boost.org.
- ↑ "Chapter 16. Boost.Function - 1.72.0". www.boost.org.
- ↑ "Chapter 1. Boost.Bind - 1.72.0". www.boost.org.
- ↑ "Chapter 1. Boost.Member Function - 1.72.0". www.boost.org.
- ↑ "Chapter 1. Boost.TypeTraits - 1.37.0". www.boost.org.
- ↑ "The Boost Tuple Library – Boost 1.48.0". Archived from the original on 2006-05-26. Retrieved 2006-05-27.
- ↑ "Chapter 5. Boost.Array - 1.72.0". www.boost.org.
- ↑ "Boost.Regex - 1.36.0". www.boost.org.
پیوند به بیرون
[ویرایش]- Scott Meyers' Effective C++: TR1 Information – حاوی پیوندهایی به اسناد پیشنهادی TR1 است که زمینه و منطق کتابخانههای TR1 را ارائه میدهد.