Dav*_*ler 2 c++ debugging templates struct casting
我的情况是我的代码中有几个不同的结构,我想要打印到控制台.
三个例子(几百个):
typedef struct ReqCntrlT /* Request control record */
{
int connectionID;
int dbApplID;
char appDescr[MAX_APPDSCR];
int reqID;
int resubmitFlag;
unsigned int resubmitNo;
char VCIver[MAX_VCIVER];
int loginID;
} ReqCntrlT;
//---------------------------------------------
typedef struct /* Connection request data block */
{
char userID[MAX_USRID];
char password[MAX_PWDID];
} CnctReqDataT;
//---------------------------------------------
typedef struct {
char userID[LOGIN_MAX_USERID];
char closure;
int applVersion;
int authorizationDataLength;
void *authorizationData; } LoginReqDataT;
Run Code Online (Sandbox Code Playgroud)
所以我想拥有的是一个调试函数,它只需要一个struct作为Parameter并输出结构的所有成员,如下所示:
LoginReqDataT* foo = new LoginReqDataT;
foo->applVersion = 123;
//...
debugPrintMe(foo);
CnctReqDataT* bar = new CnctReqDataT;
strcpy(bar->userID, "123");
strcpy(bar->password, "mypwd");
debugPrintMe(bar);
Run Code Online (Sandbox Code Playgroud)
我现在拥有的是一个无穷无尽的功能,它正在做这样的事情:
template <class T>
void debugPrintMe(T myvar)
{
if (!DEBUG) return;
if (typeid(T) == typeid(ReqCntrlT*))
{
ReqCntrlT* r = (ReqCntrlT*)myvar;
cout << "reqControl: " << endl
<< "\tconnectionID: " << r->connectionID << endl
<< "\tdbApplID: " << r->dbApplID << endl
//...
<< "\tloginID: " << r->loginID << endl << endl;
}
else if (typeid(T) == typeid(CallBkAppDataT*))
{
CallBkAppDataT* c = (CallBkAppDataT*)myvar;
cout << "appData: " << endl
<< "\tappRespBlockSize " << c->appRespBlockSize << endl
//...
<< "\tstreamType: " << c->streamType << endl << endl;
}
//... and so on
}
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来做到这一点?
Joh*_*web 11
是的,肯定有更优雅的方式(... else if (typeid(T) == ...?哎呀!).你可以operator <<()为你写一些structs.这使你的debugPrintMe()功能好和通用的,也可以让你流的结构来cout,cerr中,记录器,一ostringstream,...
这是一个让你入门的例子:
std::ostream& operator <<(std::ostream& os, const ReqCntrlT& r)
{
os << "reqControl"
<< "\n\tconnectionID: " << r.connectionID
<< "\n\tdbApplID: " << r.dbApplID
<< "\n\tappDescr: " << r.appDescr
<< "\n\treqID: " << r.reqID
<< "\n\tresubmitFlag: " << r.resubmitFlag
<< "\n\tresubmitNo: " << r.resubmitNo
<< "\n\tVCIver: " << r.VCIver
<< "\n\tloginID: " << r.loginID
<< '\n';
return os;
}
template <class T>
void debugPrintMe(const T& myvar)
{
if (DEBUG)
{
std::cout << myvar << std::endl;
}
}
int main()
{
ReqCntrlT r;
// [...]
debugPrintMe(r);
return 0;
}
Run Code Online (Sandbox Code Playgroud)