3

我深入研究了一个新项目,我用一堆模板和它们的专业化来解决这个问题。现在,在一天没有编程之后,我发现自己在问是否真的值得额外的代码行。

问题是:专业化有什么好处?

这是:

template <int i> class A {};
template <> class A <1> { void foo() {/* something */}  };
template <> class A <2> { void foo() {/* something else*/}  };
template <> class A <3> { void foo() {/* even different*/}  };

在任何方面都比更好(更快的执行)

template <int i> class A { 
   void foo() {
      if (i==1) {/* something */}
      else if (i==2) {/* something else*/}
      else if (i==3) {/* even different*/}
   }
};

?

编辑:

该代码是供其他人使用的库的一部分。我使用的是 gcc 4.6.3,但最终代码将与不同的编译器一起使用。

编辑:

这两段代码使用 gcc 4.6.3 生成相同的二进制文件。我无法测试完整的案例,因为我的实际代码远不能使用。这似乎真的是一个原则问题,多功能性,可重用性,可维护性等......

4

4 回答 4

6

速度不是这里的主要问题,但可扩展性才是。

专业化的好处是您可以让您的代码的客户更轻松地添加新的foo(). 假设您稍后决定为 : 添加新行为i=4:在第一种方法中,您只需添加一个新的特化;在第二个版本中,您需要修改功能foo()。如果您以二进制形式发布您的库,客户将不高兴。

专业化方法对第二种方法的偏好是开放/封闭原则的体现:代码应该对扩展开放,对修改关闭。

于 2012-07-01T20:00:35.517 回答
2

您在问“为什么模板专业化更好”,但让我说为什么它更糟。我想至少有一些 , 和 的代码i=1i=2常见i=3的(否则,为什么它有相同的名称?)。如果是这样,当你进行专业化时,你可能不得不复制一些代码,这使得代码难以维护。

代码重复最好留给编译器,它可以很好地使用这些 if-elseif-else 结构。你甚至可以拥有if (i<3),这将是非常尴尬的专业化实现。

当然,如果您的功能几乎完全不同,那么在使用模板专业化时您不会遇到这个缺点(并且您会获得优势)。

于 2012-07-01T20:11:53.497 回答
2

这取决于使用的编译器。我自己写了很多这样的代码,我的编译器为我做了正确的事情。但是,由于 C++ 标准中没有任何内容要求编译器在这方面很聪明,因此您可能会遇到麻烦。因此,请确保您的编译器做正确的事情。作为一般经验法则 - 如果您正在编写一个旨在供其他人使用的可重用库,如果您打算将此代码移植到不同的编译器和/或异国环境等,请不要依赖此功能。

于 2012-07-01T19:43:17.723 回答
2

有时不可能将代码编写为一个函数,因为有效的代码i=1可能对 无效i=2,即使它从未执行过,编译器也会窒息!

例如:

template <int i> class A { 
   void foo() {
      if (i==1)
      {
          cout << "Easy";
      }
      else if (i==2)
      {
          int stuff[100 * i - 110] = {42}; // error: negative array size for i=1
          cout << stuff[0];
      }
      else if (i==3)
      {
          /* even different*/
      }
   }
};
于 2012-07-01T20:51:59.187 回答