代码之家  ›  专栏  ›  技术社区  ›  hoang

为什么C中没有与Ada泛型参数等价的参数?

  •  2
  • hoang  · 技术社区  · 14 年前

    请注意,我不是在说普通的 类型 参数。

    例如,在Ada中,我可以编写一个需要使用值而不是类型初始化的包。例如

    generic
      Size : Positive;
    package Sudokus is
    
       subtype Values is Positive range 1..Size*Size;
       type Choice is private;
       type Sudoku is private;
    
       procedure Fill(S : out Sudoku);
       procedure Init(S : out Sudoku);
       procedure Solve(S : in out Sudoku);
       procedure Print(S : Sudoku);
    
       Unsolvable_Grid_Error : exception;
    

    以下是使用方法:

    package My_Sudoku is new Sudokus(3); -- 3 for 9x9 solver, 4 for 16x16 solver, etc.
    

    我想没有等价物,但我觉得它很有用。 缺席是有原因的吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    “为什么C没有特性X”的一般答案是围绕这样一个特性的好处与成本。好处通常显而易见,但成本包括:

    • 语言规范的复杂性增加
    • 使用语言的复杂度增加
    • 提高教育要求-开发人员必须了解更多信息才能理解同事的代码
    • 设计功能的成本
    • 实现特性的成本
    • 测试功能的成本
    • 增加了以后添加更多功能的难度——因为功能之间经常会相互影响,通常是以尴尬的方式

    基本上,这不应该是问为什么没有特定的特性:应该是争论特性的好处与成本相比是巨大的。功能必须在语言中赢得一席之地,而语言设计师已经把标准定得相当高。(正如安德斯在过去所说,每一个功能都以-100分开始,并且必须不断提高。)

        2
  •  1
  •   codymanix    14 年前

    为什么不简单地将大小传递给构造函数并用它初始化数组呢?

    class Sudokus 
    {
      char[] field;
      public Sudokus (int size){ field = new char[size*size]; }
    }
    

    我看到的“泛型参数”的唯一优点是如果有一个固定大小的数组,它可以允许更快的访问,但无论如何,C不支持这种方法(至少不能作为非局部变量)。

    我知道这种模板在C++中是支持的,它的模板远远优于C语言或Java中的模板。