2015-09-08 3 views
4

У меня есть некоторый код, который по существу конденсируется доПереходя шаблон, который требует запятые для одного-аргумента макрокоманды

#define FOO(a) 
FOO(std::map<int, int>); 

Но он испускает ошибку компиляции (слишком много фактических параметров для макроса FOO).

Очевидно, препроцессор думает, что я поставил std::map<int и int> в качестве аргументов.

Есть ли способ обойти это? Таким образом препроцессор не обрабатывает цитированную строку запятой.

+1

One простой способ - определить макрос, который разрешает запятую. Другое решение, когда это подходит, состоит в том, чтобы передать имя шаблона и аргументы шаблона отдельно. Тем не менее, я помню, что у Йоханнеса Шауба был аккуратный трюк для этого, который был более общим. Теперь я просто отжимаю свой мозг, чтобы попытаться запомнить его. Пока не повезло ... :( –

+0

Босс говорит, что я должен просто охладиться и использовать typedef. Но это довольно скучно. –

+0

Как насчет [BOOST_PP_COMMA] (http://stackoverflow.com/a/24793828/1708801) –

ответ

2

Это, возможно, следует в идеале быть комментарием, но ТАК не поддерживает код в комментариях, таким образом, вы можете сделать

#include <map> 

#define T_ARGS(...) <__VA_ARGS__> 

#define FOO(a) a x; 

auto main() -> int 
{ 
    FOO(std::map T_ARGS(int, int)); 
    (void) x; 
} 

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

+0

Принято поскольку, как-то, это просто кажется более элегантным, чем определение чего-то запятой. –

1

Препроцессор будет обрабатывать только несогласованные запятые в качестве разделителя макросов. Итак, что вы можете сделать, это переписать std::map<int, int> во что-то, что имеет круглые скобки вокруг него. Простой может быть decltype(std::map<int, int>()).

2

comma is being treated as a macro argument seperator, он не делает этого с запятыми в круглых скобках.

Если вы используете Boost, они обеспечивают BOOST_PP_COMMA:

#include <boost/preprocessor/punctuation/comma.hpp> 

#define FOO(a) 
FOO(std::map<int BOOST_PP_COMMA int>); 

Вы также можете задать свой собственный:

#define COMMA , 
FOO(std::map<int COMMA int>); 
1

Просто добавьте дополнительный набор скобок:

#define FOO(a) 
FOO((std::map<int, int>)); 
Смежные вопросы