【问题标题】:Having trouble with C++ variadic template parametersC++ 可变参数模板参数有问题
【发布时间】: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


【解决方案1】:

采取以下简化版:

void print() {}

template<typename First, typename... Rest>
void print(const First& first, const Rest&... rest)
{
    std::cout << first;
    print(rest...);
}

sizeof...(Rest) == 0 调用print() 时没有参数,这需要上面的基本情况重载。

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多