Вопрос по function, templates, c++, macros – Генерация функций с помощью макросов в C ++

2

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

#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

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

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

Ваш Ответ

1   ответ
10

Вы хотит

T FNAME (const T& t) \

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

Это очень хорошо. Jared Krumsie

Похожие вопросы