2011-01-18 3 views
4

Я делаю метапрограммирование метафоров, в основном просто записывая свой собственный список времени компиляции, но у меня также есть препроцессорная магия, которую я хочу использовать, чтобы сделать вещи проще, если это возможно.Многопроцессорный препроцессор __COUNTER__

То, что я пытаюсь сделать, это создать список функций компиляторов. Эта часть выполнена, но макросы для облегчения создания (и добавления в список) не являются.

Пример вкратце:

template<typename Functor, typename Tail> 
struct node { 
    typedef Functor head; 
    typedef Tail tail; 
}; 


template <typename Functor, typename Tail> 
struct push_back { 
    typedef node<Functor, Tail> list; 
}; 

struct unit0 {}; 

#define AUTO_FUNCTION(name) struct test_functor_##name {   \ 
    static void run_test();           \ 
};                 \ 
typedef push_back<             \ 
      test_functor_##name,         \ 
      CONCAT(unit, PP_DEC(__COUNTER__))      \ 
     >::list CONCAT(unit, __COUNTER__);       \ 
void test_functor_##name::run_test() 


AUTO_FUNCTION(hello) { 
    ... 
} 

Теперь это работает, потому что я создал большой набор макросов препроцессора для PP_DEC, а именно:

#define PP_DEC(x) PP_DEC_I(x) 
#define PP_DEC_I(x) PP_DEC_ ## x 
#define PP_DEC_1 0 
#define PP_DEC_2 1 
... 
#define PP_DEC_N N 

Это часть я действительно хочу, чтобы избежать и причина, по которой я задаю этот вопрос. Кто-нибудь есть предложение о том, как я могу использовать COUNTER без увеличения его стоимости, или какой-то другой способ, я могу выполнить шаблон подсчета, похожий на:

0 1 
1 2 
2 3 
... 

Предложение, которые изменяют семантику push_back и т.д. имеет Конечно, приветствую :).

PS. Это не предназначено для производства, только для удовольствия. Поэтому специальные расширения GCC приветствуются.

PPS. Я стараюсь избегать внешних зависимостей, таких как boost, поскольку я хочу понять все, что я делаю (весь смысл этого проекта).

+0

'__COUNTER__' является расширением Microsoft языка, а не стандарт C++ –

+0

@Alf P. Steinbach - Я знаю. Он действительно существует в GCC 4.3 и clang, хотя, и поскольку я действительно не против использовать для этого специальные расширения для компилятора (поскольку это только для удовольствия), использовался '__COUNTER__'. Любое другое предложение, которое выполняет нечто подобное без '__COUNTER__', конечно же, приветствуется. – Mic

+0

У меня подобная проблема - вам удалось решить эту проблему? Благодарю. знак равно –

ответ

9

Вы можете "исправить" __COUNTER__ значение, используя дополнительный макрос:

#define MY_MACRO MY_MACRO_COUNTED(__COUNTER__) 

#define MY_MACRO_COUNTED(counter) counter + counter 
Смежные вопросы