此模板可打印2D矢量的内容
您如何概括该模板,使其适用于每个STL容器?
template<class T>
void printVector(std::vector<std::vector<T>> const &matrix) {
for (std::vector<T> row : matrix) {
for (T val : row) {
std::cout << val << " ";
}
std::cout << '\n';
}
}
也许有“印刷品”可以让我打印任何东西,无论我放入什么东西? (n维容器,字符串等?)
答案 0 :(得分:3)
也许有“印刷品”可以让我打印任何东西,无论我放入什么东西? (n维容器,字符串等?)
是的,我参与了我的一个项目,以递归方式打印代表AST的嵌套树
我们需要做一些模板技巧,以确定嵌套元素是另一个容器,指针,可选类型,变量类型还是其他类型。
C ++没有反射,因此如果在任何时候遇到用户定义的类型都会出现问题,因为(当前)无法获取有关给定类型成员的信息。除非我们用register
BOOST_FUSION_ADAPT_STRUCT
。
“事物”很大,因此最好直接从repo中读取代码。
该类的用法如下:structure_printer()(object)
。第一个()
是ctor,第二个是operator()
,它将使用子元素递归地再次调用它。
它打印的结构与JSON格式非常相似。
不过:这是2D容器的简单解决方案:
template <typename Matrix>
void printMatrix(Matrix const& matr) {
for (auto const& row : matr) {
for (auto const& val : row)
std::cout << val << ' ';
std::cout << '\n';
}
}
答案 1 :(得分:1)
只要采用任何类型并使用基于范围的循环即可。唯一的问题是您指定的是std::vector
。
template<class T>
void print2Dcontainer(const T &matrix)
{
for (const auto &row : matrix)
{
for (const auto &val : row) std::cout << val << ' ';
std::cout << '\n';
}
}
我的上述版本不安全传递会导致编译错误的内容(例如传递7)。可以添加Fancy SFINAE来消除此潜在问题,但是我只针对库代码这样做。