我正在用C ++为我的项目创建一个MVC框架。下面是控制器源/伪代码片段。如您所见,我必须对每种类型进行明确检查。我为对象(模型)的每个属性存储了类型。有没有办法避免这种切换情况?
for each property P of object:
switch(type of P)
{
case(type_int):
{
int value;
model->fetch(value, P->id);
writer->write(value, P->id);
break;
}
case(type_float):
{
float value;
model->fetch(value, P->id);
writer->write(value, P->id);
break;
}
}
答案 0 :(得分:0)
请使用此模板功能代替开关
template<typename T>
void func()
{
T value;
model->fetch(value, P->id);
writer->write(value, P->id);
}
答案 1 :(得分:0)
#include<vector>
#include<algorithm>
#include<iostream>
template<typename T>
struct pred{
void operator()(T x)
{
//implemnt algorithm
}
T value;
};
class property{
};
int main()
{
std::vector<property> myShape;
std::for_each(myShape.begin(),myShape.end(), pred<property>());
std::cout<<"Done"<<std::endl;
}
答案 2 :(得分:0)
value
实际来自何处,因为您可以使用它来驱动泛型。如上所述,没有办法阻止切换,因为交换机也决定了值的类型。如果用变量替换开关(假设您不想要运行时多态性),可以使其工作。
精明的读者会注意到,当然,在内部某处,类型切换仍然会发生。基本的区别在于
变种可以在 [1] 之外进行编译时优化,在这种情况下,类型开关不需要存在于生成的代码中或更快
隐藏了类型开关,程序员在更高的抽象级别上思考
那就是说,如果它带来复杂性,可以考虑更简单的选择。这可能是过早的优化
[1] 在远远超过去虚拟化的情况下发生的更多(复杂)案例