【问题标题】:How to do a print version of 3D objects with templates? (c++)如何使用模板制作 3D 对象的打印版本? (c++)
【发布时间】:2021-02-01 03:12:10
【问题描述】:

我猜你已经看到了这个特殊的功能:

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 中这样做有什么区别吗?

【问题讨论】:

  • 我看到你接受了答案 :) 但是你所说的 c++17 和之前的区别是什么意思?
  • @cigien 我听说很多编译器默认使用 c++14 的原因(即使他们有 c++20)是因为很多项目因为在c++17 及之后的模板,这就是原因。但现在我看到这在 c++17 中完美运行
  • 嗯,我想我没听说过。我不会担心的:)
  • @cigien 也许,但顺便说一句,由于其他原因,我看到这段代码在 c++14 中不起作用。我尝试将标志更改为-std=c++14,但它无法编译。但无论如何,这是一个了不起的解决方案!
  • 嗯,你是对的。我其实不知道为什么。它应该在 c++14 中工作:p

标签: c++ templates multidimensional-array


【解决方案1】:

您可以编写以下模板重载,一个打印一维范围,另一个通过在循环中打印每个嵌套的 (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2013-02-07
    • 2021-10-09
    • 2022-01-14
    • 2023-04-02
    相关资源
    最近更新 更多