好吧所以
为了好玩而开发一个简单的日志系统,遇到了一个有趣的问题。我认为能够写一些类似以下内容的东西会很好:
Log(Info, "Result: {}", value);
给我一个像这样的结果
Result: 45
(此处使用 fmt 的格式样式。)
所以我这样设置函数:
template <typename ...args_t>
void Log(LogLevel Level, const char* Message, args_t&&... Args)
Run Code Online (Sandbox Code Playgroud)
效果很好,没有任何问题。但是,我的想法是,如果函数未修改参数,则应将其标记为 const (用于优化并作为给程序员的注释),所以我尝试了以下方法:
template <typename ...args_t>
void Log(const LogLevel Level, const char* Message, const args_t&&... Args)
Run Code Online (Sandbox Code Playgroud)
这一直给我错误,VS2017给了我
error C2665: 'Log': none of the 4 overloads could convert all the argument types
我只是做错了吗?我不应该担心参数包常量吗?有一个更好的方法吗?有时,这个参数打包业务很难让我理解。
(我花了大约 3 个小时研究这个问题,但在堆栈溢出或整个互联网上找不到任何相关信息,如果这个问题已经在其他地方得到了回答,请原谅我。)