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

**گزارش فنی ۱ سی‌پلاس‌پلاس**  نام رایج ***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، بیش از همه برای قالب-توابع مفید هستند، زمانی که کسر آرگومان، مرجعی را استنتاج نمی‌کند (مثلاً هنگام ارسال آرگومان‌ها):
```cpp
#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` یا طولانی عمل می‌کند. مثلا:
```c++
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 سعی می‌کند برخی از این تفاوت‌ها را از طریق افزودن سرصفحه‌های مختلف در کتابخانه سی‌پلاس‌پلاس، مانند ، ،  و… تطبیق دهد. این تغییرات به تطابق بیشتر سی‌پلاس‌پلاس با نسخه 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 را ارائه می‌دهد.
رده:کتابخانه استاندارد سی++