我嘗試創建一個調用使用模板的可變參數函數的宏。 我使用下面的代碼,但鏈接不能解析到宏調用...宏和模板中的可變參數函數
此代碼是Logger類的一部分:
template< typename ... Args >
void Logger::logTrace(Args const& ... args)
{
std::ostringstream stream;
using List = int[];
(void)List{ 0, ((void)(stream << args), 0) ... };
BOOST_LOG_SEV(log_, trace) << stream.str();
}
Logger類:
class Logger {
public:
static Logger* getInstance(const char *logFile = "LogClient.log");
template< typename ... Args >
void logTrace(Args const& ... args);
private:
Logger(std::string fileName);
virtual ~Logger();
void initialize(std::string fileName);
static Logger* logger_; // singleton instance
};
和宏:
#define LOG_TRACE(...) Logger::getInstance()->logTrace(__VA_ARGS__);
一個調用宏:
LOG_TRACE("A log with a number: %d", 5);
感謝您的幫助!
編輯解決:
的問題是不相關的可變參數函數,甚至宏,但鏈接。 在類定義中實現logTrace可解決問題。
代碼工作:
`Logger類:
class Logger {
public:
static Logger* getInstance(const char *logFile = "LogClient.log");
template< typename ... Args >
void logTrace(Args const& ... args)
{
std::ostringstream stream;
using List = int[];
(void)List{ 0, ((void)(stream << args), 0) ... };
BOOST_LOG_SEV(log_, trace) << stream.str();
}
private:
Logger(std::string fileName);
virtual ~Logger();
void initialize(std::string fileName);
static Logger* logger_; // singleton instance
};
和宏:
#define LOG_TRACE(...) Logger::getInstance()->logTrace(__VA_ARGS__);
一個調用宏:
LOG_TRACE("A log with a number: %d", 5);
您可以顯示'Logger'類的定義? – shrike
我已更新帖子 – Kryx
爲什麼要使用宏而不是函數? – Holt