Некоторое время назад мне было поручено обновить очень старый проект. Первое, что мне нужно было сделать, - это расширить существующий код, чтобы включить новую функцию. В рамках этого я модифицировал существующие макросы для печати представлений JSON входящих сообщений (через CORBA, в структуры C ++). Затем я добавил boost program_options и новый регистратор, и теперь я хочу модернизировать макросы.
Проблема в том, что я понятия не имею, как реализовать то, что я делал с макросами с помощью шаблонов. Основная проблема заключается в том, что я использую имя параметров в макросах для доступа к полям структуры:
//Defines the string that precedes the variable name in a JSON name-value pair (newline,indent,")
#define JSON_PRE_VNAME _T("%s,\n\t\t\t\t\"")
//Defines the string that follows the variable name in a JSON name-value pair (":) preceding the value
#define JSON_SEP _T("\":")
#define printHex(Y,X) _tprintf(_T("%02X"), (unsigned char)##Y->##X );
// ******** MACRO **********
// printParam (StructureFieldName=X, ParamType=Y)
// prints out a json key value pair.
// e.g. printParam(AgentId, %s) will print "AgentId":"3910"
// e.g. printParam(TempAgent, %d) will print "TempAgent":1
#define printParam(X,Y) if(strcmp(#Y,"%s")==0){\
_byteCount += _stprintf(_logBuf,JSON_PRE_VNAME _T(#X) JSON_SEP _T("\"%s\""),_logBuf,myEvent->##X);\
}else{\
_byteCount += _stprintf(_logBuf,JSON_PRE_VNAME _T(#X) JSON_SEP _T(#Y),_logBuf,myEvent->##X);\
}\
printBufToLog();
И это используется так:
//CORBA EVENT AS STRUCT "event"
else if(event.type == NI_eventSendInformationToHost ){
evSendInformationToHost *myEvent;
event.data >>= myEvent; //demarshall
printParam(EventTime,%d);
printParam(Id,%d);
printParam(NodeId,%d);
}
и это приводит к JSON так:
"EventTime": 1299239194,
"Id": 1234567,
"NodeId": 3
и т.д ...
Очевидно, что я достаточно хорошо прокомментировал эти макросы, но я надеюсь, что для всех, кто смотрит на код, есть хороший способ добиться того же результата с помощью шаблонов. Я должен сказать, что с помощью макросов очень легко добавлять новые события в регистратор сообщений.
Как мне сделать "#X" и ## X с шаблонами?
Любые указатели приветствуются.
Спасибо!