2D容器的通用打印

时间:2019-04-19 21:35:26

标签: c++

此模板可打印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维容器,字符串等?)

2 个答案:

答案 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来消除此潜在问题,但是我只针对库代码这样做。