作者donkeychen (Bad_To_The_Bone)
看板C_and_CPP
標題[問題] Variadic Macros + tamplate問題
時間Tue Sep 23 17:52:17 2014
開發平台(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屬於我敘述問題的情況
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.59.147.226
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1411465939.A.9E6.html
推 CindyLinz: 換用一個新一點的 compiler.. (逃 09/23 17:56
→ donkeychen: ^^; 這情況不會出現在新版的嗎.... 09/23 17:58
推 johnjohnlin: ( FUN_C<int, float>(14) ) 加括號 09/23 19:59
→ johnjohnlin: 至少 g++ 4.8.2 會過 09/23 20:00
推 CindyLinz: 嗯,我知道比較老的compiler對 template 的 < > 語法處 09/23 20:44
→ CindyLinz: 理比較弱, 像是 A<B<T>> 的 >> 認成位移運算出錯.. 09/23 20:45
→ CindyLinz: 所以想說也許換新的有機會 XDXD 09/23 20:45
推 LPH66: 樓上那是 C++98 的規定如此, C++11 有新增規定處理這種狀況 09/23 21:49
→ LPH66: 不過我現在已經習慣在中間塞個空白就是了... 09/23 21:50
→ donkeychen: 剛剛試了 用() 可行 感謝大家 :) 09/24 09:20
→ donkeychen: 想用macro省code 真是蠻多地方要注意的 危險危險^^; 09/24 14:12