decir que tengo una macro como esto:¿Cómo pasar plantillas de múltiples argumentos a macros?
#define SET_TYPE_NAME(TYPE, NAME) \
template<typename T> \
std::string name(); \
\
template<> \
std::string name<TYPE>() { \
return NAME; \
}
Esto no funcionará si lo paso una plantilla que tiene más de un parámetro, ya que el coma en el <int, int>
se interpreta como la separación de las macro argumentos , no los argumentos de la plantilla.
SET_TYPE_NAME(std::map<int, int>, "TheMap")
// Error: macro expects two arguments, three given
Este problema parece estar resuelto al hacer esto:
SET_TYPE_NAME((std::map<int, int>), "TheMap")
Pero ahora surge otro problema, uno que realmente no esperaba:
template<>
std::string name<(std::map<int, int>)>()
// template argument 1 is invalid
Parece que el extra los paréntesis hacen inválido el argumento de la plantilla. ¿Hay alguna forma de evitar esto?
Sólo C++ 11, a menos C99 añadió 'template' mientras estábamos sin mirar. –
@KennyTM: ¡Maldito, un minuto por delante de mí! –
@MikeDeSimone: __VA_ARGS__ se introdujo en C99, por lo que un compilador de C++ (por ejemplo, gcc 4.2) podría admitirlo en C++ como una extensión no estándar. – kennytm