首页 > 解决方案 > 有没有办法用递归函数的参数包部分专门化模板?

问题描述

我正在尝试制作一个打印函数,C++该函数接受可变数量的参数并将它们分别打印在自己的行上,例如:

template<typename Ty, typename... Types>
void println(Ty cur_line, Types... other_lines)
{
    std::cout << cur_line << '\n';
    println(other_lines);
}
void println() { std::cout << std::flush; }

但是,如果Ty碰巧是 a std::vector<std::string>,我想以不同的方式对待它(因为我想在自己的行上打印向量的每个元素)。我研究了部分专业化,但在使用参数包时似乎找不到太多东西。这是我尝试过的:

template<typename Ty, typename... Types>
void println(Ty cur_line, Types... other_lines)
{
    std::cout << cur_line << '\n';
    println(other_lines);
}

template<typename... Types>
void println<std::vector<std::string>, Types...>
    (std::vector<std::string> cur_line, Types... other_lines)
{
    for (const auto& line : cur_line)
    {
        std::cout << line << '\n';
    }
    println(other_lines);
}

void println() { std::cout << std::flush; }

但是,我收到一个 MSVC 错误 C2768:“ 'println': illegal use of explicit template arguments”。任何建议或解决方案都将受到热烈欢迎!作为参考,我使用的是 Visual Studio 2019 Preview 及其相应的编译器版本。

标签: c++templatesvariadic-functionsgeneric-programmingpartial-specialization

解决方案


一种更简单的方法是使用打印功能并重载:

template < typename T >
void print(const T& line)
{
    std::cout << line << '\n';
}

template < typename T >
void print(const std::vector<T>& line)
{
    for (const auto& element : line)
    {
        print(element);
    }
}

template<typename Ty, typename... Types>
void println(Ty cur_line, Types... other_lines)
{
    print(cur_line);
    println(other_lines);
}

void println() { std::cout << std::flush; }

推荐阅读