【发布时间】:2017-01-19 00:01:43
【问题描述】:
我正在尝试编写一个通用函数来记录一些用于调试的内容,我想像这样调用它:
Log("auo", 34); //writes: auo34
Point point;
point.X = 10;
point.Y = 15;
Log(35, point, 10); //writes: 35{10, 15}10
但是,我在参数打包和解包方面遇到了各种各样的问题,我似乎无法掌握它。以下是完整代码:
struct Point {
long X, Y;
}
std::ofstream debugStream;
template<typename ...Rest>
void Log(Point first, Rest... params) { //specialised for Point
if (!debugStream.is_open())
debugStream.open("bla.log", ios::out | ios::app);
debugStream << "{" << first.X << ", " << first.Y << "}";
Log(params...);
}
template<typename First, typename ...Rest>
void Log(First first, Rest... params) { //generic
if (!debugStream.is_open())
debugStream.open("bla.log", ios::out | ios::app);
debugStream << first;
Log(params...);
}
请问如何修复这些功能?
【问题讨论】:
-
当参数包为空并且对
Log()的调用将被评估时,您需要为最后一次递归调用提供基本情况。添加void Log() {}重载就足够了。
标签: c++ parameters variadic-templates variadic-functions variadic