Как передать шаблоны с несколькими аргументами в макросы?

Скажем, у меня есть такой макрос:

#define SET_TYPE_NAME(TYPE, NAME) \
    template<typename T>          \
    std::string name();           \
                                  \
    template<>                    \
    std::string name<TYPE>() {    \
        return NAME;              \
    }

Это не сработает, если я передам ему шаблон с более чем одним параметром, потому что запятая в интерпретируется как разделение аргументов макроса , а не аргументов шаблона.

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

Похоже, что лишние круглые скобки делают аргумент шаблона недействительным. Есть ли способ обойти это?

12
задан Paul Manta 20 January 2012 в 14:30
поделиться