گزارش فنی ۱ سی‌پلاس‌پلاس

گزارش فنی ۱ سی‌پلاس‌پلاس  نام رایج 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 استانداردسازی نشده بود.
 beta ، legendre و… به فایل‌های هدر <cmath> / <math.h> اضافه شده‌اند.

این توابع احتمالاً مورد توجه برنامه‌نویسان در رشته‌های مهندسی و علمی قرار خواهند گرفت.

جدول زیر تمام ۲۳ عملکرد ویژه توصیف شده در TR1 را نشان می‌دهد.

هر تابع دو نوع دیگر دارد. اضافه کردن پسوند " 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 گنجانده شده‌است
 کتابخانه استاندارد قالب، بخشی از کتابخانه استاندارد فعلی سی‌پلاس‌پلاس

منابع

پیوند به بیرون 
 Scott Meyers' Effective C++: TR1 Information – حاوی پیوندهایی به اسناد پیشنهادی TR1 است که زمینه و منطق کتابخانه‌های TR1 را ارائه می‌دهد.
کتابخانه استاندارد سی++