[问题] Variadic Macros + tamplate问题

楼主: donkeychen (Bad_To_The_Bone)   2014-09-23 17:52:17
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
vc 2005
问题(Question):
定义 variadic macros 时
, 与 tamplate的 , 无法区分
#define MACRO_C(msg, ...) \
{\
ostringstream oss; \
oss << "MACRO_B: " << __VA_ARGS__ << " " << msg; \
cout << oss.str() << endl; \
}
在这行时 会把tamplate的逗号当作是上面 msg与 ...的区隔
MACRO_C("NOT " << FUN_C<int, float>(14) << " MACRO_C: " << 15 , "ERROR?");
想请教一下如何写才能避免此情况呢
感谢
程式码(Code):(请善用置底文网页, 记得排版)
#include <sstream>
#include <iostream>
using namespace std;
#define MACRO_A(x) \
{\
ostringstream oss; \
oss << x; \
cout << oss.str() << endl; \
}
#define MACRO_B(...) \
{\
ostringstream oss; \
oss << "MACRO_B: " << __VA_ARGS__; \
cout << oss.str() << endl; \
}
#define MACRO_C(msg, ...) \
{\
ostringstream oss; \
oss << "MACRO_B: " << __VA_ARGS__ << " " << msg; \
cout << oss.str() << endl; \
}
string FUN_B(int x)
{
ostringstream oss;
oss << x;
return oss.str();
}
template<class X, class Y>
string FUN_C(X x)
{
ostringstream oss;
oss << x;
return oss.str();
}
int _tmain(int argc, _TCHAR* argv[])
{
MACRO_A("MACRO_A: " << 1 << " MACRO_A: " << 2);
MACRO_A("MACRO_A: " << FUN_B(3) << " MACRO_A: " << 4);
string c = FUN_C<int, float>(5);
MACRO_A("MACRO_A: " << c << " MACRO_A: " << FUN_B(6));
// MACRO_A("MACRO_A: " << FUN_C<int, float>(7) << " MACRO_A: " << FUN_B(8));
MACRO_B(FUN_C<int, float>(9));
MACRO_B("I AM " << FUN_C<int, float>(10) << " MACRO_B: " << 11);
MACRO_C("OK?", "MACRO_C: " << 12 << " MACRO_C: " << 13);
// MACRO_C("NOT " << FUN_C<int, float>(14) << " MACRO_C: " << 15 , "ERROR?");
return 0;
}
补充说明(Supplement):
上面黄色两行都会compile error
第二个ERROR属于我叙述问题的情况
作者: CindyLinz (Cindy Wang)   2014-09-23 17:56:00
换用一个新一点的 compiler.. (逃
楼主: donkeychen (Bad_To_The_Bone)   2014-09-23 17:58:00
^^; 这情况不会出现在新版的吗....
作者: johnjohnlin (嗯?)   2014-09-23 19:59:00
( FUN_C<int, float>(14) ) 加括号至少 g++ 4.8.2 会过
作者: CindyLinz (Cindy Wang)   2014-09-23 20:44:00
嗯,我知道比较老的compiler对 template 的 < > 语法处理比较弱, 像是 A<B<T>> 的 >> 认成位移运算出错..所以想说也许换新的有机会 XDXD
作者: LPH66 (-6.2598534e+18f)   2014-09-23 21:49:00
楼上那是 C++98 的规定如此, C++11 有新增规定处理这种状况不过我现在已经习惯在中间塞个空白就是了...
楼主: donkeychen (Bad_To_The_Bone)   2014-09-24 09:20:00
刚刚试了 用() 可行 感谢大家 :)想用macro省code 真是蛮多地方要注意的 危险危险^^;

Links booklink

Contact Us: admin [ a t ] ucptt.com