Я рефакторинг некоторого существующего шаблонного кода, и понял, что 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
расширять?
Задача ещё не решена.
Других решений пока нет …