【发布时间】:2010-08-05 20:01:46
【问题描述】:
假设我有一个数据类型enum TreeTypes { TallTree, ShortTree, MediumTree }。
我必须根据一种特定的树类型初始化一些数据。
目前我已经写了这段代码:
int initialize(enum TreeTypes tree_type) {
if (tree_type == TallTree) {
init_tall_tree();
}
else if (tree_type == ShortTree) {
init_short_tree();
}
else if (tree_type == MediumTree) {
init_medium_tree();
}
return OK;
}
但这是某种愚蠢的代码重复。我没有使用任何强大的 C++ 功能,例如模板。
我怎样才能更好地编写这段代码?
谢谢,博达·赛多。
【问题讨论】:
-
看起来改进你的代码应该从设计开始。您可以尝试通过巧妙地使用其他语言特性来替换像 if(){}else{} 这样好的旧控制结构,但我怀疑它会改进代码。写更多关于问题本身的内容。你想建模什么。
-
我使用的代码比较复杂。我试图用非常小的例子来简化它。我正在处理一个非常大的项目,并且在一个地方用户可以拥有各种数据类型(这里我称它们为 TallTree、ShortTree、MediumTree)。对于每种数据类型,我都必须采取一些措施。就我而言,它有 12 种不同的类型,所以我的 if/else if/else if/ 是 12 种不同的 if/else if/... 语句。非常糟糕。
-
但是当你实际调用初始化时,tree_type 参数是从哪里来的。是初始化普通函数还是某个类的方法?这些初始化函数是否作用于一些全局数据?他们初始化什么。没有参数。它们是方法吗?
-
我也简化了。它们都采用相同的 3 个参数。 tree_type 参数来自用户输入,取决于用户选择的操作。一旦他选择它,我必须为他初始化对话框(这实际上是tree_type - 对话框类型),初始化函数使用指向窗口的指针来初始化对话框,指向用户信息和日志数据结构的指针(以前的操作保存在哪里,所以他可以撤消任务)。
-
所以我在想的是一个像“initialize”这样的函数,我想在 tree_type 上模板化它,比如
initialize<tree_type>(window, user_info, logger)并有单独的模板专业化,比如template <> bool initialize<TallTree>(Window *w, UserInfo *u, Logger *l)但这不太管用.我不能用变量tree_type调用模板。