テンプレートを使用する可変関数を呼び出すマクロを作成しようとしています。 このコードは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();
}
ロガークラス:
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);
ありがとうございました!
EDITし、解決:
問題は可変引数関数またはが、リンクでも、マクロに関連していませんでした。 クラス定義にlogTraceを実装すると、問題が解決されます。
コード作業:
`ロガークラス:
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