我深入到一个新的项目,我有一堆模板和他们的专业化解决。 现在,无需编程一天后,我发现自己问,是否真的值得额外的代码行。
现在的问题是:什么是专业化的优势是什么?
这是:
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等的问题...
速度并不是主要的问题在这里,但扩展性。
专业化的优势在于,你更容易使你的代码的客户端添加新的重载foo()
假设你决定添加新的行为为i=4
:在第一种方法,你只需要添加一个新的专业化分工; 在第二个版本,你需要修改函数foo()
如果您已经发布您的二进制形式的库,客户端将不会开心。
该专业化的方针到第二个的优先级为打开/封闭原则的体现:代码应该对扩展开放,对修改关闭。
这取决于所使用的编译器。 我写的代码一样,我有很多和我的编译器做正确的事情对我来说。 然而,由于没有在C ++标准要求编译器在这方面聪明,你不妨让自己成为一个麻烦。 因此,请确保您的编译器做正确的事。 作为一个一般的经验法则 - 如果你正在写意图被别人使用,如果您打算端口此代码,以不同的编译器和/或外来环境等可重复使用的库不靠这个功能
你问:“为什么模板专业化越好”,但让我说为什么更是雪上加霜。 我想,至少一些所述码为i=1
, i=2
和i=3
是共同的(否则,为什么它具有相同的名字吗?)。 如果是这样,你可能当你去专业化复制一些代码,这使得代码难以维护。
重复代码是最好留给编译器,这确实是非常好与这些IF-ELSEIF-else结构。 你甚至可以有if (i<3)
这将是非常尴尬的专业化来实现。
当然,如果你的函数几乎完全不同,你不使用模板的专业化当得到这个缺点(和你得到的好处)。
有时它是不可能写出的代码为一个功能,因为代码有效期为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*/
}
}
};