c++ - 如何使用模板制作 3D 对象的打印版本? (c++)

标签 c++ templates multidimensional-array

我猜你已经见过这个特殊的函数:

template<typename T> void print(const T& cont){
    for (auto &i: cont)
        std::cout << i << " ";
    std::cout << std::endl;
}

它打印几乎所有类型的容器,例如 std::list。现在我想创建一个打印(作为示例)3D std::vector,看看这个幻想:

template<typename T1, typename T2> void print(const T1<T2>&);

但这当然不是模板的工作原理。怎么做?同样重要的是:在 c++17 和 pre-c++17 中这样做有什么区别吗?

最佳答案

您可以编写以下模板重载,一个打印一维范围,另一个通过在循环中打印每个嵌套的 (N-1)D 范围来打印 N 维范围:

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

这是一个demo .

关于c++ - 如何使用模板制作 3D 对象的打印版本? (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64408769/

相关文章:

c++ - 分配 Union 的字段

c++ - C++ 中的费马分解

c++ - 为什么我不能使用 std::get

c++ - Barton-Nackman 技巧中使用的 C++ 非模板成员是什么?

multidimensional-array - 在 Julia 中切片和广播多维数组 : meshgrid example

java - 使用循环以类似Python的方式连接Java中的数组元素

c++ - 合并两个 QPixmap 的问题

c++ - 从 C++ 列表中删除元素的问题

c++ - 将变量模板限制为类型列表

c - 使用数组保存和打印数据时遇到问题