c++ - 有没有办法用递归函数的参数包部分专门化模板?
问题描述
我正在尝试制作一个打印函数,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 及其相应的编译器版本。
解决方案
一种更简单的方法是使用打印功能并重载:
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; }
推荐阅读
- vue.js - 如何在没有大量基础架构的情况下让 Vue 组件在 Apache 上运行
- javascript - 谷歌浏览器扩展动态列表创建问题
- php - 如何在 Go 中实现 PHP 的 gzopen?
- javascript - 单选按钮组 -> 应该赋予它什么值 - .setSelected()
- excel - 如何创建工作表的非动态副本?
- c# - 属性“[ApiExplorerSettings(IgnoreApi = true)]”有什么作用?
- django - 将 django 设置传输到环境变量
- android - 如何将键盘与 webview_flutter / JavascriptChannels 与 flutter_webview_plugin 一起使用
- sql - Postgres - 基于 groupby 将列转换为行
- environment-variables - 如果环境变量存在,则安装 Wix MsiPackage