Генерация функций с помощью макросов в C ++

У меня есть следующий макрос, который предназначен для генерации функций в текущей области или пространстве имен:

#define MAKE_FUNC(FNAME) \
template <typename T> \
T ##FNAME## (const T& t) \
{\
   return t; \
}

MAKE_FUNC(foo)
MAKE_FUNC(boo)

int main()
{
   foo(1);
   boo(2);
}

Ниже приведено сообщение об ошибке при компиляции вышеуказанного кода:

prog.cpp:8:1: error: pasting "Tfoo" and "(" does not give a valid preprocessing token
prog.cpp:9:1: error: pasting "Tboo" and "(" does not give a valid preprocessing token
prog.cpp:8: error: ISO C++ forbids declaration of ‘Tfoo’ with no type
prog.cpp:9: error: ISO C++ forbids declaration of ‘Tboo’ with no type
prog.cpp: In function ‘int main()’:
prog.cpp:13: error: ‘foo’ was not declared in this scope
prog.cpp:14: error: ‘boo’ was not declared in this scope

http://ideone.com/paiu1

Кажется, что конкатенация потерпела неудачу, есть ли вокруг этой проблемы?

 John Dibling15 мая 2012 г., 22:31
Я знаю, что я должен быть всем, я в порядке, ты в порядке, но Макрос сосет большую часть времени.
 R. Martinho Fernandes15 мая 2012 г., 22:31
Конкатенация не провалилась. Он работал именно так, как рекламируется. Похоже, что вы не хотели объединения, хот
 Jared Krumsie15 мая 2012 г., 22:36
@ R.MartinhoFernandes: очень верно. :)
 Crazy Eddie15 мая 2012 г., 22:43
Помимо нежелания конкатенировать, попытка конкатенировать что-либо и '(' создает «недопустимый токен» на некоторых компиляторах. Некоторые компиляторы поглощают его прямо. На самом деле я никогда не мотивировал себя стать экспертом препроцессора. .Я не знаю, что правильно.

Ответы на вопрос(1)

Решение Вопроса

Вы хотит

T FNAME (const T& t) \

## объединяет, вы не хотите объединять.

 Jared Krumsie15 мая 2012 г., 22:36
Это очень хорошо.

Ваш ответ на вопрос