c++ - 如何使用模板制作 3D 对象的打印版本?(c++)
问题描述
我猜你已经看到了这个特殊的功能:
template<typename T> void print(const T& cont){
for (auto &i: cont)
std::cout << i << " ";
std::cout << std::endl;
}
它打印几乎所有类型的容器,例如std::list
. 现在我想创建一个打印(例如)3Dstd::vector
的,看看这个幻想:
template<typename T1, typename T2> void print(const T1<T2>&);
但这当然不是模板的工作方式。怎么做?同样重要的是:在 c++17 和 pre-c++17 中这样做有什么区别吗?
解决方案
您可以编写以下模板重载,一个打印一维范围,另一个通过在循环中打印每个嵌套的 (N-1)D 范围来打印 ND 范围:
template<template<typename...> class Range,
// ^ ^
// Note the template template parameter
typename T>
void print(Range<T> const & cont) // #1
{
for (auto const & i : cont)
std::cout << i << " "; // print 1-D range
std::cout << std::endl;
}
template<template<typename...> class RangeOut,
template<typename...> class RangeIn,
typename T>
void print(RangeOut<RangeIn<T>> const & cont) // #2
{
for (auto const &i: cont)
print(i); // call print overload:
// calls #1 if RangeIn is 1-D range
// calls #2 otherwise
std::cout << std::endl;
}
现在您可以打印任意维度的容器(范围),并由异构类型组成,例如:
std::vector<std::list<std::vector<int>>> vlv{{{1,2}, {3}} ,{{4,5}, {6}}};
print(vlv); // ok
这是一个演示。
推荐阅读
- configuration - vscode 文本编辑器设置——手动配置语言列表
- php - 在 php codeigniter 中显示父项下的子记录
- python - 是否可以在 IPython / Jupyter 中结合魔法?
- windows - 在特定任务启动后 5 分钟运行任务计划程序任务
- javascript - 为什么我在 querySelectorAll 上收到错误 TS2339 复选框属性“已选中”不存在
- sql - 在这种情况下如何进行内部联接?
- php - PHP,RabbitMQ 消息位 fwrite 异常
- windows - 您不能以 root 身份运行 CocoaPods (Windows 10)
- python - 如何重写哪个类有很多@property的python代码?
- database - “表或视图不存在”在 Oracle DB 中出现