【发布时间】:2021-04-12 08:15:55
【问题描述】:
所以我的问题...我有一个记录器类,它打印一个记录器消息,它在宏的帮助下创建。它打印不同的信息,例如函数名称、行号等。
我的消息有一个对元组,其中包含 var 的名称及其值。
using namespace std;
std::string ThisThreadGetIdString() {
stringstream ss;
ss << this_thread::get_id();
return ss.str();
}
#define GET_NAME(x) #x
template<typename... Args>
auto GetTupleOfPairs(Args... args) {
return std::tuple<std::pair<std::string, Args>...>({ GET_NAME(args), args }...);
}
#define WRITE_LOG_WITH_PARAMS(logger, messageString, logLevel, ...) \
(logger).PrintLogMessage(LogMessage(messageString, logLevel, __LINE__, \
filesystem::path(__FILE__).filename().string(), \
__FUNCTION__, __TIMESTAMP__, ThisThreadGetIdString(), GetTupleOfPairs(__VA_ARGS__))) \
消息类ctor是
template<typename... Args>
LogMessage<Args...>::LogMessage(const std::string& messageString, const LogLevel logLevel,
const unsigned lineNumber, const std::string& fileString,
const std::string& functionString, const std::string& timeString,
const std::string& threadId, const std::tuple<std::pair<std::string, Args>...>& args)
: logLevel_(logLevel), lineNumber_(lineNumber), threadId_(threadId),
fileString_(fileString), functionString_(functionString),
timeString_(timeString), messageString_(messageString),
paramTuple_(args)
{}
正如预期的那样,元组存储GetTupleOfPairs的参数名称
constexpr auto var1 = 1;
constexpr auto var2 = 1.4f;
// Output: [PROD] Thread id: [111876] Line number: 72 Message: It doesn't works properly args = 1, args = 1.4
WRITE_LOG_WITH_PARAMS(log, "It doesn't works properly", LogLevel::PROD, var1, var2);
// Have to: [PROD] Thread id: [111876] Line number: 72 Message: It doesn't works properly var1 = 1, var2 = 1.4
但这对我来说似乎没用。那么,我怎样才能得到预期的输出呢?也许我必须在宏的帮助下获得成对的“var's name”和“var's value”的元组,但我不知道它是否可能。
【问题讨论】: