Элемент массива Boost Preprocessor

Я рефакторинг некоторого существующего шаблонного кода, и понял, что Boost ::: Препроцессор может упростить вещи, но у меня уже возникли проблемы … Вот простой пример:

#define CLASSES ( 4, ( A, B, C, D ) )
#define FOWARD_CLASS( Z, N, _ ) class BOOST_PP_ARRAY_ELEM( N, CLASSES );

BOOST_PP_REPEAT( 4, FOWARD_CLASS, _ );

Я ожидаю, что это расширится до:

class A;class B;class C; class D;

Но я на самом деле получаю:

error: expected identifier before ‘(’ token
error: expected `)' before ‘(’ token

Повторяется четыре раза. Не имея возможности «увидеть» выходные данные препроцессора, я действительно изо всех сил пытаюсь понять, в чем проблема — может кто-нибудь более опытный предложить решение?

ОБНОВИТЬ

Переключение на использование последовательности заставляет ее работать:

#define CLASSES (A)(B)(C)(D)
#define FOWARD_CLASS( R, _ , ELEM ) class ELEM;

BOOST_PP_SEQ_FOR_EACH( FOWARD_CLASS, _, CLASSES )

Однако я не вижу причины, по которой последний пример не сработал!

Повторите вывод Ppreprocessor

Вот вывод исходного кода (с BOOST_PP_REPEAT):

class BOOST_PP_ARRAY_ELEM( 0, ( 4, ( A, B, C, D ) ) );
class BOOST_PP_ARRAY_ELEM( 1, ( 4, ( A, B, C, D ) ) );
class BOOST_PP_ARRAY_ELEM( 2, ( 4, ( A, B, C, D ) ) );
class BOOST_PP_ARRAY_ELEM( 3, ( 4, ( A, B, C, D ) ) );

Для ясности добавлены разрывы строк. Ну, очевидно, почему компилятор жаловался, интересно, что еще я должен был сделать, чтобы заставить BOOST_PP_ARRAY_ELEM расширять?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector