Этот раздел иллюстрирует альтернативный синтаксис для компиляторов без вариадной макроподдержки.
Большинство современных компиляторов поддерживаютвариаидные макросы(в частности, они включают GCC, MSVC и всекомпиляторы C++11). Однако в том редком случае, когда программистам необходимо использовать эту библиотеку на компиляторе без вариадных макросов, эта библиотека также позволяет задать свои макропараметры с помощьюBoost. препроцессорпоследовательность, где токены разделены круглыми скобками<()
>:
(token1) (token2) ...
Вместо разделённого на запятую списка, который мы видели до сих пор и который требует вариадных макросов:
token1, token2, ...
Например, на всех компиляторах с вариадными макросами и без них принимается следующий синтаксис (см. также<add_seq.cpp
>):
int main(void) {
int sum = 0, factor = 10;
void BOOST_LOCAL_FUNCTION( (const bind factor) (bind& sum) (int num) ) {
sum += factor * num;
} BOOST_LOCAL_FUNCTION_NAME(add)
add(1);
int nums[] = {2, 3};
std::for_each(nums, nums + 2, add);
BOOST_TEST(sum == 60);
return boost::report_errors();
}
Однако на компиляторах с вариадными макросами синтаксис, разделенный запятой, который мы видели до сих пор, предпочтительнее, потому что более читаемый (см. также<add.cpp
>):
int main(void) {
int sum = 0, factor = 10;
void BOOST_LOCAL_FUNCTION(const bind factor, bind& sum, int num) {
sum += factor * num;
} BOOST_LOCAL_FUNCTION_NAME(add)
add(1);
int nums[] = {2, 3};
std::for_each(nums, nums + 2, add);
BOOST_TEST(sum == 60);
return boost::report_errors();
}
Обратите внимание, что одни и те же макросы принимают оба синтаксиса на компиляторах с вариадными макросами и только синтаксис последовательности на компиляторах без вариадных макросов. Наконец, пустой список локальных параметров функций всегда указывается с помощью<void
>на компиляторах с вариадными макросами и без них:
int BOOST_LOCAL_FUNCTION(void) {
return 10;
} BOOST_LOCAL_FUNCTION_NAME(ten)
BOOST_TEST(ten() == 10);
Для справки ниже приведен список большинства примеров, представленных в этой документации, перепрограммированных с использованием синтаксиса последовательности вместо синтаксиса, разделенного запятой (в алфавитном порядке):