template<class T>
void swap(T &a, T &b)
{
T t;
t = a;
a = b;
b = t;
}
替换
void swap(int &a, int &b)
{
int t;
t = a;
a = b;
b = t;
}
这是我能提出的最简单的例子,但是应该有许多其他复杂的函数。如果可能的话,我应该创建所有我写的模板吗?
这样做有什么不利之处吗?
感谢。
答案 0 :(得分:11)
Genericity具有可重用的优势。但是,只有在以下情况下才能写出通用的东西:
但是,了解您的标准库。您提交的案例已在STL中显示为std::swap
。
另外,请记住,在使用模板进行一般编写时,可以使用模板特化来优化特殊情况。但是,总是要当它需要性能时,而不是你写的时候。
另外,请注意,这里有运行时和编译时性能的问题。基于模板的解决方案增加了编译时间。内联解决方案可以但不能减少运行时间。
`原因“过早的优化和通用性是所有邪恶的根源”。你可以引用我-_-。
答案 1 :(得分:10)
只有在您实际重用它时,可重用代码才是可重用的。所以在第一个实例中自然地编写函数。如果稍后你遇到一个代码可以通过一些调整重用的情况,请回过头来重构它,在重构阶段你应该考虑编写模板函数。
答案 2 :(得分:4)
对你的问题最简单的回答是许多人比我自己多聪明多年来所说的:
永远不要写出超过你可以逃脱的最低限度。
答案 3 :(得分:3)
使它们成为通用的,因为你可以轻而易举地制作它们。如果它真的是微不足道的(例如上面的例子)那么它不需要额外的工作,并且可能在将来为你节省一些工作
答案 4 :(得分:1)
第一次写交换时,你不应该
第二次它可能很诱人,但有时你可以逃脱而不会让整件事变得一团糟
第三次应该明确你必须。但是,根据您使用过一两个地方的情况,这可能会非常耗时,因此第二次应该是一个好的决定
答案 5 :(得分:0)
始终使用模板存在缺点。它(可以)大大增加了程序的编译时间,并且可能使编译错误更难理解。
正如taldor所说,不要让你的功能更加通用。
答案 6 :(得分:0)
您可以查看函数参数及其使用方式。如果所有操作都是通过重载操作符完成的,则该函数可能非常通用,并且是成为模板的良好候选者。否则,非常专业的类类型和函数调用的存在可能会使通用的可重用性成为问题,并且应该通过多态来实现任何最终的灵活性。
答案 7 :(得分:0)
一些想法:
了解STL。已经std::swap
了。不要花时间让一切尽可能通用,而是花时间熟悉STL。
在你需要它之前不要这样做:"Always implement things when you actually need them, never when you just foresee that you need them."---Ron Jeffries。如果您实际上没有重用代码而没有编写可重用的代码,那么您编写了不必要的代码。不必要的代码开发成本高,测试成本高,维护成本高。不要忘记opportunity cost!
保持简单:“让一切尽可能简单,但不要简单。”---爱因斯坦。这是KISS。