Технический отчет 1 C ++ (TR1 ) общее название для ISO / IEC TR 19768, C ++ Library Extensions, который представляет собой документ, предлагающий дополнения к стандартной библиотеке C ++ для языка C ++ 03 стандарт. Добавления включают регулярные выражения, интеллектуальные указатели, хэш-таблицы и генераторы случайных чисел. TR1 сам по себе не был стандартом, а скорее проектным документом. Однако большинство его предложений стало частью более позднего официального стандарта C ++ 11. До стандартизации C ++ 11 поставщики использовали этот документ в качестве руководства для создания расширений. Целью отчета было «создать более широко распространенную существующую практику для расширенной стандартной библиотеки C ++».
Отчет был впервые распространен в виде черновика в 2005 г. как Проект технического отчета о расширениях библиотеки C ++, а затем опубликован в 2007 г. как стандарт ISO / IEC как ISO / IEC TR 19768 : 2007.
Содержание
- 1 Обзор
- 2 Компоненты
- 2.1 Общие утилиты
- 2.2 Функциональные объекты
- 2.3 Метапрограммирование и свойства типов
- 2.4 Числовые возможности
- 2.4.1 Случайное число поколение
- 2.4.2 Математические специальные функции
- 2.5 Контейнеры
- 2.5.1 Типы кортежей
- 2.5.2 Массив фиксированного размера
- 2.5.3 Хеш-таблицы
- 2.6 Регулярные выражения
- 2.7 Совместимость с C
- 3 Технический отчет 2
- 4 См. Также
- 5 Ссылки
- 6 Внешние ссылки
Обзор
Компиляторы не должны включать компоненты TR1 чтобы соответствовать стандарту C ++, поскольку предложения TR1 не были частью самого стандарта, а были лишь набором возможных дополнений, которые еще не ратифицировали. Однако большая часть TR1 была доступна из Boost, и несколько распространителей компиляторов / библиотек реализовали все или некоторые компоненты. TR1 - это далеко не полный список дополнений к библиотеке, появившихся в C ++ 11. Например, C ++ 11 включает библиотеку поддержки потоков, которая недоступна в TR1.
Новые компоненты были определены в пространстве имен std::tr1
, чтобы отличать их от текущей стандартной библиотеки.
Компоненты
TR1 включает в себя следующие компоненты:
Общие утилиты
Оболочка ссылок - позволяет передавать ссылки, а не копии, в алгоритмы или функциональные объекты. Эта функция была основана на Boost.Ref. Ссылка на оболочку получается из экземпляра класса шаблона reference_wrapper
. Ссылки-оболочки аналогичны обычным ссылкам («») языка C ++. Для получения ссылки на оболочку от любого объекта используется шаблонный класс ref
(для постоянной ссылки используется cref
).
Ссылки на оболочки полезны прежде всего для шаблонных функций, когда вывод аргумента не приводит к ссылке (например, при пересылке аргументов):
#include #include void f (int r) {++ r; } шаблон < class Funct, class Arg>void g (Funct f, Arg t) {f (t); } int main () {int я = 0; г (ж, я); // создается экземпляр 'g < void(int r), int>' std :: cout << i << "\n"; // Output: 0 g( f, std::tr1::ref(i)); // 'g< void(int r), reference_wrapper>'создается экземпляр std :: cout << i << "\n"; // Output: 1 }
Умные указатели - добавляет несколько классов, которые упрощают управление временем жизни объекта в сложных случаях. Добавлены три основных класса:
shared_ptr
- интеллектуальный указатель с подсчетом ссылокweak_ptr
- вариант shared_ptr
, который не увеличивает счетчик ссылок
Предложение основано на библиотеке Boost Smart Pointer.
Функциональные объекты
Эти четыре модуля добавляются в файл заголовка
:
Полиморфная оболочка функции (функция
) - может хранить любую вызываемую функцию (указатели функций, указатели функций-членов и объекты функций), которая использует указанную сигнатуру вызова функции. Тип не зависит от типа используемого вызываемого объекта. На основе Boost.Function
Связывания функциональных объектов (bind
) - могут связывать любой параметр параметры с функциональными объектами. Допускается также функциональная композиция. Это обобщенная версия стандартных функций связывания std :: bind1st
и std :: bind2nd
. Эта функция основана на библиотеке Boost Bind.
Типы возвращаемых функций (result_of
) - определяет тип выражения вызова.
Функции-члены (mem_fn
) - расширение стандартного std :: mem_fun
и std :: mem_fun_ref
. Позволяет обрабатывать указатели на функции-члены как объекты функций. На основе библиотеки Boost Mem Fn.
Метапрограммирование и признаки типов
Теперь существует заголовочный файл
, который содержит множество полезных мета-шаблонов признаков, таких как is_pod
, has_virtual_destructor
, remove_extent
и т. Д. Он упрощает метапрограммирование, разрешая запросы и преобразование между различными типами . Предложение основано на библиотеке свойств типа Boost.
Числовые возможности
Генерация случайных чисел
- новый
файл заголовка - variate_generator
, mersenne_twister
, poisson_distribution
и т. Д. - утилиты для генерации случайных чисел с использованием любого из нескольких генераторов псевдослучайных чисел, механизмов и распределений вероятностей
математических специальных функций
Некоторые функции TR1, такие как математические специальные функции и некоторые дополнения C99, не включены в реализацию TR1 Visual C ++. Библиотека специальных математических функций не была стандартизирована в C ++ 11.
- дополнения к заголовочным файлам
/
- beta
, legendre
и т. Д.
Эти функции, вероятно, будут представлять основной интерес для программистов в инженерных и научных областях. дисциплины.
В следующей таблице показаны все 23 специальные функции, описанные в TR1.
Имя функции | Прототип функции | Математическое выражение |
---|
Связанные многочлены Лагерра | double assoc_laguerre (без знака n, без знака m, двойной x); | |
---|
Связанные многочлены Лежандра | double assoc_legendre (беззнаковый l, беззнаковый m, двойной 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 (без знака n, двойной x); | |
---|
Гипергеометрический ряд | двойной hyperg (double a, double b, double c, double x); | |
---|
Многочлены Лагерра | double laguerre (без знака n, double x); | |
---|
многочлены Лежандра | double legendre (беззнаковый l, двойной x); | |
---|
дзета-функция Римана | double riemann_zeta (double x); | |
---|
Сферические функции Бесселя первого рода | double sph_bessel (беззнаковый n, двойной x); | |
---|
Сферические связанные функции Лежандра | double sph_legendre (без знака l, без знака m, двойная тета); | |
---|
Сферические функции Неймана Сферические функции Бесселя второго рода | double sph_neumann (unsigned n, double x); | |
---|
У каждой функции есть два дополнительных варианта. Добавление суффикса «f » или «l » к имени функции дает функцию, которая работает со значениями float
или long double
соответственно.. Например:
float sph_neumannf (unsigned n, float x); длинный двойной sph_neumannl (беззнаковый n, длинный двойной x);
Контейнеры
Типы кортежей
- новый
файл заголовка - кортеж
- на основе библиотеки Boost Tuple
- , неявно расширение стандартного
std :: pair
- коллекция элементов фиксированного размера, которые могут быть разных типов
массив фиксированного размера
- новый
заголовочный файл - массив
- взят из библиотеки Boost Array
- в отличие от типов динамических массивов, таких как стандартные
std :: vector
Хеш-таблицы
- new
, <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
и включает стандартные библиотечные функции
, которые работают для set
и multiset
- , новая реализация, не полученная из существующей библиотеки, не полностью совместимая с API существующими библиотеками
- как все хеш-таблицы, часто обеспечивают постоянное время поиск элементов, но в худшем случае может быть линейным по размеру контейнера
Регулярные выражения
- новый
файл заголовка - регулярное выражение
, regex_match
, regex_search
, regex_replace
и т. Д. - на основе библиотеки Boost RegEx
- библиотеки сопоставления с образцом
Совместимость с C
C ++ разработан для обеспечения совместимости с языком программирования C, но не является строгим надмножеством C из-за различных стандартов. TR1 пытается согласовать некоторые из этих различий путем добавления к различным заголовкам в библиотеке C ++, таких как , , и т. Д. Эти изменения помогают привести C ++ в большее соответствие с версией C99 стандарта C ( не все части C99 включены в TR1).
Технический отчет 2
В 2005 году был сделан запрос предложений по TR2 с особым интересом к Unicode, XML / HTML, сети и удобству использования для начинающих программистов. Звонок TR2 для предложений.
Некоторые из предложений включали:
- Потоки [1]
- Библиотека Asio C ++ (сетевое взаимодействие [2 ] [3 ] ).
- Сигналы / слоты [sigc Предложение по стандартизации в библиотеке C ++ TR2] [4]
- Библиотека файловой системы Библиотека файловой системы для TR2 - на основе Boost Filesystem Библиотека для запросов / манипуляции с путями, файлами и каталогами.
- Boost Any Library Any Library Proposal for TR2
- Lexical Conversion Library Conversion Library Proposal for TR2
- New String Algorithms Предложение по новым строковым алгоритмам в TR2
- На пути к более полной таксономии алгебраических свойств для числовых библиотек в TR2 ISO / IEC JTC1 / SC22 / WG21 - Papers 2008
- Добавление гетерогенного сравнительного поиска в ассоциативные контейнеры для TR2 [5]
После того, как был объявлен конкурс предложений по TR2, процедуры ISO были изменены, поэтому TR2 не будет. Вместо этого усовершенствования C ++ будут опубликованы в ряде технических спецификаций. Некоторые из перечисленных выше предложений уже включены в стандарт C ++ или в черновые версии технических спецификаций.
См. Также
- C ++ 11, стандартный для языка программирования C ++; улучшения библиотеки были основаны на TR1
- C11 (стандартная версия C), самом последнем стандарте для языка программирования C
- Boost library, большой коллекции переносимых библиотек C ++, некоторые из которых были включен в TR1
- Стандартную библиотеку шаблонов, часть текущей Стандартной библиотеки C ++
Ссылки
Источники
Внешние ссылки
- Эффективный C ++ Скотта Мейерса: информация TR1 - содержит ссылки на документы предложения TR1, которые предоставляют справочную информацию и обоснование для библиотеки TR1.