Скажем, у меня такой макрос:
#define SET_TYPE_NAME(TYPE, NAME) \
template<typename T> \
std::string name(); \
\
template<> \
std::string name<TYPE>() { \
return NAME; \
}
Это не сработает, если я передам ему шаблон с более чем одним параметром, потому что запятая в <int, int>
интерпретируется как разделение аргументов макроса, а не аргументов шаблона.
SET_TYPE_NAME(std::map<int, int>, "TheMap")
// Error: macro expects two arguments, three given
Эта проблема, кажется, решается, делая это:
SET_TYPE_NAME((std::map<int, int>), "TheMap")
Но теперь возникает другая проблема, которую я действительно не ожидал:
template<>
std::string name<(std::map<int, int>)>()
// template argument 1 is invalid
Похоже, что дополнительные круглые скобки делают аргумент шаблона недействительным. Есть ли способ обойти это?