2013-04-10 2 views
1

У меня есть этот простой (бесполезный) код для демонстрации проблемы:C++ макросов и шаблонов с несколькими аргументами ошибки

template<typename _Tx, typename _Ty> 
struct foo{}; 

#define TO_STRING(Type) #Type 

int main() 
{ 
    std::string sInt = TO_STRING(int); 
    std::string sfoo1 = TO_STRING(foo<int, float>); //warning and unexpected value - "foo<int" 
    std::string sfoo2 = TO_STRING((foo<int, float>)); //no warning, still unexpected value "(foo<int, float>)" 
} 

Есть ли способ передать шаблоны с несколькими аргументами в макросы без использования ()?

+0

Нет, не существует способа. –

+0

Что вы скомпилируете, так что проглатывание тихо, когда вы передаете один или два аргумента макросу? –

+0

@RomanSaveljev Visual Studio 2010 – Felics

ответ

0

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

#define TO_STRING1(_a_) #_a_ 
#define TO_STRING2(_a_, ...) #_a_ ", " TO_STRING1(__VA_ARGS__) 
#define TO_STRING3(_a_, ...) #_a_ ", " TO_STRING2(__VA_ARGS__) 
#define TO_STRING4(_a_, ...) #_a_ ", " TO_STRING3(__VA_ARGS__) 

Единственным недостатком является то, что вы должны сами подсчитать запятые, например:

std::string sInt = TO_STRING1(int); 
std::string sfoo = TO_STRING2(foo<int, float>); 
Смежные вопросы