【发布时间】:2013-05-28 02:41:50
【问题描述】:
我有一个名为 Writer 的类,它有一个函数 writeVector,如下所示:
void Drawer::writeVector(vector<T> vec, bool index=true)
{
for (unsigned int i = 0; i < vec.size(); i++) {
if (index) {
cout << i << "\t";
}
cout << vec[i] << "\n";
}
}
我正在努力避免重复代码,同时仍然担心性能。
在函数中,我正在对我的for-loop 的每一轮进行if (index) 检查,即使结果始终相同。
这是反对“担心性能”的。
我可以通过将检查放在我的for-loop 之外来轻松避免这种情况。
但是,我会得到大量重复的代码:
void Drawer::writeVector(...)
{
if (index) {
for (...) {
cout << i << "\t" << vec[i] << "\n";
}
}
else {
for (...) {
cout << vec[i] << "\n";
}
}
}
所以这些对我来说都是“坏”的解决方案。
我一直在想的是两个私有函数,其中一个超出索引,然后调用另一个。
另一个只是超出了价值。
但是,我不知道如何在我的程序中使用它,我仍然需要 if 检查以查看要调用哪个...
根据问题,多态似乎是一个正确的解决方案。 但我看不出我应该如何在这里使用它。 解决此类问题的首选方法是什么?
这不是一个真正的程序,我只是想了解应该如何解决这类问题。
【问题讨论】:
-
@JonathonReinhart 也许有些人想学习编程,对如何解决问题感到好奇?
-
我已经给这个问题+1了。这种优化可能并不经常需要,但首先,指出这一事实可能是答案的一部分,其次,罕见的优化类型仍然与编程高度相关。
-
问题是关于避免代码重复和循环内部复杂逻辑的良好设计。这是一个好问题,无需反对。
-
这是一个有趣的问题,通常编译器中的循环转换会非常有效地解决这个问题。如果函数像这样足够小,则内联会处理它,并且很可能会完全杀死分支。我宁愿更改代码,直到内联程序愉快地内联代码,而不是使用模板解决这个问题。
-
@JonathonReinhart:你们为什么不能假设 OP 已经分析了他的代码,然后回答这个该死的问题?即使OP没有,将来看到这个问题的人也可能有。用愚蠢的“你为什么在乎?” cmets 来驳回问题,你没有给任何人任何好处。
标签: c++ c++11 for-loop design-patterns