-->

模板专业化或条件表达式?(Template specialization or conditiona

2019-09-18 22:03发布

我深入到一个新的项目,我有一堆模板和他们的专业化解决。 现在,无需编程一天后,我发现自己问,是否真的值得额外的代码行。

现在的问题是:什么是专业化的优势是什么?

这是:

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相同的二进制文件。 我的实际代码是远远可用我无法测试的全部情况。 这真的好像是原则,versatiliy,可重用性,maintanability等的问题...

Answer 1:

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

专业化的优势在于,你更容易使你的代码的客户端添加新的重载foo() 假设你决定添加新的行为为i=4 :在第一种方法,你只需要添加一个新的专业化分工; 在第二个版本,你需要修改函数foo() 如果您已经发布您的二进制形式的库,客户端将不会开心。

该专业化的方针到第二个的优先级为打开/封闭原则的体现:代码应该对扩展开放,对修改关闭。



Answer 2:

这取决于所使用的编译器。 我写的代码一样,我有很多和我的编译器做正确的事情对我来说。 然而,由于没有在C ++标准要求编译器在这方面聪明,你不妨让自己成为一个麻烦。 因此,请确保您的编译器做正确的事。 作为一个一般的经验法则 - 如果你正在写意图被别人使用,如果您打算端口此代码,以不同的编译器和/或外来环境等可重复使用的库不靠这个功能



Answer 3:

你问:“为什么模板专业化越好”,但让我说为什么更是雪上加霜。 我想,至少一些所述码为i=1i=2i=3是共同的(否则,为什么它具有相同的名字吗?)。 如果是这样,你可能当你去专业化复制一些代码,这使得代码难以维护。

重复代码是最好留给编译器,这确实是非常好与这些IF-ELSEIF-else结构。 你甚至可以有if (i<3)这将是非常尴尬的专业化来实现。

当然,如果你的函数几乎完全不同,你不使用模板的专业化当得到这个缺点(和你得到的好处)。



Answer 4:

有时它是不可能写出的代码为一个功能,因为代码有效期为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*/
      }
   }
};


文章来源: Template specialization or conditional expressions?