Если предположить, что в 99% случаев допустимое количество параметров (10 или меньше), то разумно использовать отдельный макрос LOG с постфиксом, подсчитывающим количество параметров. Тогда любой параметр, который может быть передан через потоковый оператор в класс stringstream
, будет работать.
Что-то вроде следующего для поддержки параметров 1-4. Расширение до 5 или более параметров означает просто добавлять новые макросы.
void LogIt(const std::string& str)
{
Logger::getInstance().Print(str.c_str());
}
#define LOG1(a) \
{ \
std::ostringstream ss; \
ss << a; \
LogIt(ss.str()); \
}
#define LOG2(a, b) \
{ \
std::ostringstream ss; \
ss << a; \
ss << b; \
LogIt(ss.str()); \
}
#define LOG3(a, b, c) \
{ \
std::ostringstream ss; \
ss << a; \
ss << b; \
ss << c; \
LogIt(ss.str()); \
}
#define LOG4(a, b, c, d) \
{ \
std::ostringstream ss; \
ss << a; \
ss << b; \
ss << c; \
ss << d; \
LogIt(ss.str()); \
}
int main()
{
int temp = 10;
std::string tempStr = "hello";
LOG4("test num:", temp, ", str:", tempStr);
return 0;
}