Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Functionality for "empty" seqs and tuples

Boost , Chapter 1. The Variadic Macro Data Library 1.9 , Useful variadic macros not in Boost PP

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Массивы и списки Boost PP могут быть пустыми, но секвы и кортежи не могут. Форма пустого массива — «(0,())», а форма пустого списка — «BOOST_PP_NIL». Но форма «()» не представляет собой пустой сек или пустой кортеж. Вместо seq он представляет собой один элемент seq, данные которого пусты, в то время как для кортежа он представляет собой кортеж размером 1, один элемент которого пуст.

Отсутствие способа представления пустого seq или tuple представляет собой небольшую проблему для пользователей Boost PP. Для кортежа, особенно, невозможность быть «пустым» является единственной причиной, по которой конечный пользователь может предпочесть использовать массив, а не кортеж в качестве данных препроцессора Boost PP. В противном случае, при использовании вариадных макросов, использование кортежа легче отметить и впоследствии использовать, чем массив, поскольку для указания количества элементов кортежа не требуется никаких усилий.

VMD, как мы видели, имеет функциональность, чтобы определить, когда данные препроцессора «пусты». BOOST_VMD_IS_EMPTY макрос. Из-за этого можно рассматривать пустоту, при нанесении на сек или кортеж, как пустой сек или пустой кортеж соответственно, что позволяет сек и кортежи быть пустыми, как массивы и списки.

Однако существует одна большая проблема при рассмотрении пустоты как пустой сек или пустой кортеж; функция Boost PP для сек или кортежа ничего не знает об этом. Другими словами, если вы передали пустоту макросу Boost PP, который ожидает seq или tuple, например:

BOOST_PP_SEQ_SIZE()

или

BOOST_PP_TUPLE_PUSH_BACK(,1)

Вы получите UB, неопределенное поведение.

Для того, чтобы использовать секвы и кортежи, которые могут быть пустыми, VMD определяет ряд макросов, которые имитируют многие из них в Boost PP, но начинаются с BOOST_VMD_, а не с BOOST_PP_. Макросы VMD работают с тем, что я буду называть VMD seq или VMD tuple, в то время как эквиваленты Boost PP работают с традиционным seq или tuple. VMD seq - это seq, который может быть пустым, а VMD tuple - это кортеж, который может быть пустым. Поэтому VMD seq является супермножеством нормального seq, а VMD tuple является супермножеством нормального tuple. Таким образом, функциональность VMD может принимать VMD seq или tuple или обычный seq или tuple, тогда как эквивалентная функциональность Boost PP принимает только обычный seq или tuple. Чтобы быть более точным, функция Boost PP может принимать VMD seq или VMD tuple, если он не пуст. Другими словами, нет никакой разницы между непустым VMD seq или Boost PP seq, или между непустым VMD tuple и Boost PP tuple.

Конкретные макросы, которые VMD поставляет, поддерживая VMD seqs и VMD tuples, разделены между массивом, списком, seq и функциональностью tuple. Фактические файлы заголовков для этих макросов находятся в подкаталогах каталога VMD, которые начинаются соответственно с «array», «list», «seq» и «tuple». Файлы заголовка также включены в общий файл заголовка boost/vmd/vmd.hpp.

Array macros

Макросы массивов обеспечивают преобразования из массива в VMD seq или VMD tuple. Массивными макросами являются:

Table 1.1. Array macros

Макро

Параметр

Возвращение

Функциональность

Заголовок

Boost_VMD_ARRAY_TO_SEQ

массив = массив Boost PP

A VMD seq

Преобразует массив в VMD seq. Если массив пуст, то seq пуст, в противном случае преобразование будет таким же, как BOOST_PP_ARRAY_TO_SEQ.

boost/vmd/array/to_seq.hpp

Boost_VMD_ARRAY_TO_TUPLE

массив = массив Boost PP

Кортеж VMD

Преобразует массив в кортеж VMD. Если массив пуст, то кортеж пуст, в противном случае преобразование будет таким же, как в BOOST_PP_ARRAY_TO_TUPLE.

boost/vmd/array/to_tuple.hpp


Разница между макросами преобразования массивов и их эквивалентами в Boost PP заключается в том, что если массив пуст, макросы VMD возвращают пустоту, тогда как макросы Boost PP имеют UB.

Вы можете включить макросы массива, используя их отдельные файлы заголовка, общий файл заголовка «boost/vmd/array.hpp» для всех макросов массива или общий файл заголовка «boost/vmd/vmd.hpp» для всех макросов.

List macros

Макросы списка обеспечивают конверсии из списка в VMD seq или VMD tuple. Список макросов:

Table 1.2. List macros

Макро

Параметр

Возвращение

Функциональность

Заголовок

Boost_VMD_LIST_TO_SEQ

список = список повышения PP

A VMD seq

Преобразует список в VMD seq. Если список пуст, сек пуст, в противном случае конверсия будет такой же, как BOOST_PP_LIST_TO_SEQ.

boost/vmd/list/to_seq.hpp

Boost_VMD_LIST_TO_TUPLE

список = список повышения PP

Кортеж VMD

Преобразует список в кортеж VMD. Если список пуст, кортеж пуст, в противном случае преобразование будет таким же, как BOOST_PP_LIST_TO_TUPLE.

boost/vmd/list/to_tuple.hpp


Разница между макросами преобразования списка и их эквивалентами в Boost PP заключается в том, что если список пуст, макросы VMD возвращают пустоту, тогда как макросы Boost PP имеют UB.

Вы можете включить макросы списка, используя их отдельные файлы заголовка, общий файл заголовка «boost/vmd/list.hpp» для всех макросов списка или общий файл заголовка «boost/vmd/vmd.hpp» для всех макросов.

Seq macros

Макросы сек либо работают с секвой VMD, либо возвращают сек VMD. Макросы seq являются:

Table 1.3. Seq macros

Макро

Параметр

Возвращение

Функциональность

Заголовок

Boost_VMD_IS_VMD_SEQ

последовательность = последовательность VMD

1 если последовательность VMD является VMD seq, то 0

Тестирует последовательность как VMD seq. Если последовательность пуста, возвращается 1, в противном случае возвращается то же самое, что и BOOST_VMD_IS_SEQ

.

boost/vmd/seq/is_vmd_seq.hpp

Boost_VMD_SEQ_POP_BACK

seq = a Boost PP seq

A VMD seq

Помещает элемент с конца seq. Если сек имеет один элемент, возвращает пустой сек, иначе работает точно так же, как BOOST_PP_SEQ_POP_BACK.

boost/vmd/seq/pop_back.hpp

Boost_VMD_SEQ_POP_FRONT

seq = a Boost PP seq

A VMD seq

Помещает элемент от начала seq. Если сек имеет один элемент, возвращает пустой сек, иначе работает точно так же, как BOOST_PP_SEQ_POP_FRONT.

boost/vmd/seq/pop_front.hpp

Boost_VMD_SEQ_PUSH_BACK

seq = VMD seq, elem = элемент, чтобы нажать на конец VMD seq

A Boost PP seq

Нажимает элемент на конец VMD seq. Если сек VMD пуст, возвращаемый сек состоит из этого элемента, иначе он работает точно так же, как BOOST_PP_SEQ_PUSH_BACK

.

boost/vmd/seq/push_back.hpp

Boost_VMD_SEQ_PUSH_FRONT

seq = VMD seq, elem = элемент, чтобы нажать на начало VMD seq

A Boost PP seq

Нажимает элемент на начало VMD seq. Если сек VMD пуст, возвращаемый сек состоит из этого элемента, иначе он работает точно так же, как BOOST_PP_SEQ_PUSH_FRONT

.

boost/vmd/seq/push_front.hpp

BOOST_VMD_SEQ_REMOVE

seq = a Boost PP seq, i = индекс элемента для удаления

A VMD seq

Удаляет элемент из Boost PP seq. Если сек имеет один элемент и индекс, подлежащий удалению, равен 0, возвращается пустой сек, иначе работает точно так же, как BOOST_PP_SEQ_REMOVE

.

boost/vmd/seq/remove.hpp

Boost_VMD_SEQ_SIZE

seq = VMD seq

Количество элементов в VMD seq

Возвращает число элементов в VMD seq. Если сек пустой возвращает 0, в противном случае работает точно так же, как BOOST_PP_SEQ_SIZE

.

boost/vmd/seq/size.hpp

BOOST_VMD_SEQ_TO_ARRAY

seq = VMD seq

Усиление PP массива

Преобразует VMD seq в массив Boost PP. Если сек пустой возвращает пустой массив, форма которого «(0,())», в противном случае работает точно так же, как BOOST_PP_SEQ_TO_ARRAY

.

boost/vmd/seq/to_array.hpp

Boost_VMD_SEQ_TO_LIST

seq = VMD seq

Расширенный список

Преобразует сек VMD в список Boost PP. Если сек пустой возвращает пустой список, форма которого «BOOST_PP_NIL», в противном случае работает точно так же, как BOOST_PP_SEQ_TO_LIST

.

boost/vmd/seq/to_list.hpp

Boost_VMD_SEQ_TO_TUPLE

seq = VMD seq

Кортеж VMD

Преобразует сек VMD в кортеж VMD. Если сек пустой возвращает пустой кортеж, в противном случае работает точно так же, как BOOST_PP_SEQ_TO_TUPLE

.

boost/vmd/seq/to_tuple.hpp


Разница между макросами сек и их эквивалентами в Boost PP заключается в том, что работа с секвой VMD или возвращение секвой VMD действительны с макросами сек, но с макросами с эквивалентом Boost PP, работающими с пустым сек, вызывает UB, и возвращение пустого сек никогда не может произойти.

Вы можете включить макросы seq, используя их отдельные файлы заголовка, общий файл заголовка «boost/vmd/seq.hpp» для всех макросов seq или общий файл заголовка «boost/vmd/vmd.hpp» для всех макросов.

Tuple macros

Кортежные макросы либо работают с кортежом VMD, либо возвращают кортеж VMD. Кортежные макросы:

Table 1.4. Tuple macros

Макро

Параметр

Возвращение

Функциональность

Заголовок

Boost_VMD_IS_VMD_TUPLE

последовательность = последовательность VMD

1 если последовательность VMD является кортежом VMD, то 0

Тестирует последовательность в виде VMD-кортежа. Если последовательность пуста, возвращается 1, в противном случае возвращается так же, как BOOST_VMD_IS_TUPLE

.

boost/vmd/tuple/is_vmd_tuple.hpp

Boost_VMD_TUPLE_POP_BACK

tuple = Boost PP tuple

Кортеж VMD

Помещает элемент с конца кортежа. Если размер кортежа 1 возвращает пустой кортеж, в противном случае он работает точно так же, как BOOST_PP_TUPLE_POP_BACK

.

boost/vmd/tuple/pop_back.hpp

Boost_VMD_TUPLE_POP_FRONT

tuple = Boost PP tuple

Кортеж VMD

Помещает элемент от начала кортежа. Если размер кортежа 1 возвращает пустой кортеж, в противном случае он работает точно так же, как BOOST_PP_TUPLE_POP_FRONT

.

boost/vmd/tuple/pop_front.hpp

Boost_VMD_TUPLE_PUSH_BACK

кортеж = кортеж VMD, элем = элемент для нажатия на конец кортежа VMD

Усиление PP кортежа

Нажимает элемент на конец кортежа VMD. Если VMD-кортеж пуст, возвращаемый кортеж состоит из этого элемента, иначе он работает точно так же, как BOOST_PP_TUPLE_PUSH_BACK

.

boost/vmd/tuple/push_back.hpp

Boost_VMD_TUPLE_PUSH_FRONT

кортеж = кортеж VMD, элем = элемент для нажатия на начало кортежа VMD

Усиление PP кортежа

Нажимает элемент на начало кортежа VMD. Если VMD-кортеж пуст, возвращаемый кортеж состоит из этого элемента, иначе он работает точно так же, как BOOST_PP_TUPLE_PUSH_FRONT

.

boost/vmd/tuple/push_front.hpp

Boost_VMD_TUPLE_REMOVE

кортеж = кортеж Boost PP, i = указатель элемента для удаления

Кортеж VMD

Удаляет элемент из кортежа Boost PP. Если кортеж имеет один элемент и индекс, подлежащий удалению, равен 0, возвращается пустой кортеж, иначе он работает точно так же, как BOOST_PP_TUPLE_REMOVE

.

boost/vmd/tuple/remove.hpp

Boost_VMD_TUPLE_SIZE

кортеж = кортеж VMD

Количество элементов в кортеже VMD

Возвращает количество элементов в кортеже VMD. Если кортеж пустой возвращает 0, в противном случае работает точно так же, как BOOST_PP_TUPLE_SIZE

.

boost/vmd/tuple/size.hpp

BOOST_VMD_TUPLE_TO_ARRAY

кортеж = кортеж VMD

Усиление PP массива

Преобразует шлейф VMD в массив Boost PP. Если кортеж пустой возвращает пустой массив, форма которого «(0,())», в противном случае работает точно так же, как BOOST_PP_TUPLE_TO_ARRAY

.

boost/vmd/tuple/to_array.hpp

Boost_VMD_TUPLE_TO_LIST

кортеж = кортеж VMD

Расширенный список

Преобразует скорлупу VMD в список Boost PP. Если кортеж пустой, возвращается пустой список, форма которого «BOOST_PP_NIL», иначе работает точно так же, как BOOST_PP_TUPLE_TO_LIST

.

boost/vmd/tuple/to_list.hpp

Boost_VMD_TUPLE_TO_SEQ

кортеж = кортеж VMD

A VMD seq

Преобразует скорлупу VMD в сек VMD. Если кортеж пустой, возвращает пустой сек, иначе работает точно так же, как BOOST_PP_TUPLE_TO_SEQ

.

boost/vmd/tuple/to_seq.hpp


Разница между кортежными макросами и их эквивалентными в Boost PP заключается в том, что работа с кортежем VMD или возврат кортежа VMD действительна с кортежными макросами, но с макросами эквивалента Boost PP, работающими с пустым кортежем, вызывает UB, и возврат пустого кортежа никогда не может произойти.

Вы можете включить макросы кортежа, используя их отдельные файлы заголовка, общий файл заголовка «boost/vmd/tuple.hpp» для всех макросов кортежа или общий файл заголовка «boost/vmd/vmd.hpp» для всех макросов.

Seq and tuple functionality

Набор макросов для функций seq и tuple, которые работают с VMD seqs и VMD tuples, в значительной степени является лишь подмножеством функций seq и tuple в Boost PP. Это отражает тот факт, что ряд макросов в Boost PP для работы с seq или tuple не имеет смысла при расширении для работы с возможным пустым seq или пустым tuple. Например, BOOST_PP_SEQ_FIRST_N не может ничего означать при прохождении пустого seq и BOOST_PP_TUPLE_REM_CTOR. Ничего не могло значить, когда проходил пустой кортеж. Аналогично для других макросов Boost PP seq и tuple, которые не имеют эквивалента VMD.

Набор функций в VMD для работы с, возможно, пустым сек или пустым кортежем позволяет добавлять или удалять элементы в сек или кортеже, которые могут начинаться или заканчиваться пустыми, принимать размер сек или кортежа, даже когда сек или кортеж пусты, конвертировать между массивами, списками, секами или кортежами, которые могут начинаться или заканчиваться пустыми, и тестировать для сек VMD или кортежа VMD. Эта функциональность должна позволить макропрограммистам работать с пустыми секами и кортежами, все еще используя другие Boost PP сек и фанктуиональность для работы с непустыми секами и кортежами. Самый простой способ сделать это - использовать эквивалентные функции VMD seq и VMD tuple при выборе между VMD и Boost PP и использовать функциональность Boost PP seq и tuple иначе. Просто помните, что функция Boost PP seq и tuple никогда не может работать с пустыми секами или пустыми кортежами.


PrevUpHomeNext

Статья Functionality for "empty" seqs and tuples раздела Chapter 1. The Variadic Macro Data Library 1.9 Useful variadic macros not in Boost PP может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Useful variadic macros not in Boost PP ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:09:03/0.0096340179443359/0