【问题标题】:C++: Function templatesC++:函数模板
【发布时间】:2011-10-10 05:38:34
【问题描述】:

我有 2 个代表迷宫的二维数组

const char maze1[10][11]const char maze2[20][21]

我正在尝试创建 1 个函数来处理两个迷宫,如下所示:

void solveMaze(maze[][])
{
}

然后像solveMaze(maze1);一样通过迷宫

我将如何使用函数模板来做到这一点?

我最近已经问过这个问题,但明确要求不要使用函数模板,因为我不确定如何使用它,但我想看看它是如何工作的。 (希望这不是“滥用”系统)

【问题讨论】:

  • 我认为这不能通过模板来完成。如果你想要一个 char 迷宫、int 迷宫或 float 迷宫,你会使用模板,但不仅仅是不同尺寸的 char 迷宫。
  • @ChadSchouggins:实际上,数组维度可以是模板参数。典型示例是获取数组大小的模板函数:template <typename T, size_t N> size_t size(T (&)[N]) { return N; }。虽然语法很晦涩。
  • @codeCube:这很有意义,因为模板参数是常量,这可以允许编译器针对某些大小执行特定的优化。这里值得怀疑,但有一天可能会有所帮助。
  • @codeCube:您并不完全正确。我可以想到几种情况,您希望使用整数常量作为模板参数。例如,一个模板化的、任意大小的位域类。

标签: c++ arrays templates function


【解决方案1】:

您不需要也不应该使用模板来解决这个问题。你所做的只是解决不同大小的迷宫。

模板用于生成大量使用各种类型的类/函数。

而是构造一个类来存储迷宫。此类应存储迷宫的尺寸并允许访问该迷宫的组件。

【讨论】:

    【解决方案2】:

    首先,如果您使用更好的数组,它会简单得多。 C 数组的问题在于它们容易衰减为指针,一旦衰减,大小就会丢失(亲爱的,就我而言,这很愚蠢......)

    然后,选择取决于您是使用固定大小的数组还是想要动态大小的数组:

    • 对于固定大小:std::array(或者如果不可用,boost::array
    • 对于动态大小:std::vector

    由于模板在 std::array 案例中更有意义,我想这就是您选择的。

    char const maze1[10][11]
    

    等价于

    std::array<std::array<char, 11>, 10> const maze1
    

    略显冗长,但std::array 提出了常规的成员方法,如.size().begin().end() 等......并且可以轻松地在函数中传递。

    现在,开始您的模板函数。签名将是:

    template <size_t M, size_t N>
    void solveMaze(std::array<std::array<char, N>, M> const& maze);
    

    但是,尽管您提出了问题,但您更可能不想在这里使用模板(它们没有什么好处)。所以我建议使用vector 和常规函数:

    void solveMaze(std::vector< std::vector<char> > const& maze);
    

    【讨论】:

      【解决方案3】:
      template<int w, int h>
      void solveMaze(const char (&maze)[w][h])
      {
          //can use w,h now
      } 
      

      【讨论】:

        【解决方案4】:

        没有真正支持多维数组。您应该考虑使用对尺寸有适当支持的类。以下是诀窍

        template<int N, int M>
        void solveMaze(const char (&maze)[N][M]) {
            size_t n = N;
            size_t m = M;
            int x = 0;
        }
        
        int main(int argc, char *argv[])
        {
            const char maze[3][2] = { { 0, 1} , {2, 3}, {4, 5} };
            solveMaze(maze);
            return 0;
        }
        

        【讨论】:

        • 非常有趣。出于好奇,为什么要将这些变量传递给 main?他们对此有必要吗?
        • @dukevin 哪些变量 - argc 和 argv?这些不是必需的——我的 IDE 认为 main 应该是这样的:P
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        相关资源
        最近更新 更多