Я делаю метапрограммирование метафоров, в основном просто записывая свой собственный список времени компиляции, но у меня также есть препроцессорная магия, которую я хочу использовать, чтобы сделать вещи проще, если это возможно.Многопроцессорный препроцессор __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, поскольку я хочу понять все, что я делаю (весь смысл этого проекта).
'__COUNTER__' является расширением Microsoft языка, а не стандарт C++ –
@Alf P. Steinbach - Я знаю. Он действительно существует в GCC 4.3 и clang, хотя, и поскольку я действительно не против использовать для этого специальные расширения для компилятора (поскольку это только для удовольствия), использовался '__COUNTER__'. Любое другое предложение, которое выполняет нечто подобное без '__COUNTER__', конечно же, приветствуется. – Mic
У меня подобная проблема - вам удалось решить эту проблему? Благодарю. знак равно –