【发布时间】:2012-09-24 13:40:09
【问题描述】:
我想实现一个工厂函数来创建对象。我的对象模板如下所示:
template <typename TA, typename TB>
struct MyImpl : public MyInterface
{
// content
};
而我的工厂是这样的:
MyInterface* factory(char ta, char tb)
{
if(ta == 'c' && tb == 'c')
{
return new MyImpl<char, char>();
}
if(ta == 'c' && tb == 's')
{
return new MyImpl<char, short>();
}
if(ta == 's' && tb == 'c')
{
return new MyImpl<short, char>();
}
// and so on ....
}
工厂函数必须接受非静态字符数据(ta,tb),因为它无法在编译时确定,我认为这就是工厂的全部意义所在。事实上,ta 和 tb 是从文件(或网络)中读取的。
我想要一个更简单的解决方案来避免烦人的 2 级切换。
我认为我的问题类似于how-would-one-write-a-meta-if-else-if-in-c,除了我不能使用静态参数。
也许我应该回退到 C 宏并使用一些宏技巧来缩减我当前的代码?
提前致谢!
更新
@Rob 的回答:
我的实际代码会更复杂,其中包含许多其他内容,更难阅读,并且在许多方面都不相关。我正在尝试正确的伪代码,如果有任何问题,请告诉我:-)。
回复@Dynguss:
我的问题是,在我的实际实现中,工厂的参数(ta,tb)的范围会很大,比如10 X ta和20 X tb,而ta和tb的组合会很长,并且难以维护。所以我至少需要一些方法来简化组合工作。
【问题讨论】:
-
工厂?你的意思是像古希腊那样的“假特洛伊”?你想写木马吗?
-
@Dynguss:我认为这个例子不言自明:
<short, char> -
生成代码是一种选择吗?您可以生成一个不错的开关,并将 O(n^2) 减少到 O(n) 查找。
-
@Dynguss:它是一个工厂,根据保存的文本配置创建对象。如果不清楚,您应该检查工厂设计模式是什么。
-
您的代码中有两个可能与问题无关的错误,也可能与问题无关。您能否发布演示您的问题的 actual (不是伪代码)?请参阅sscce.org 了解更多信息。