控制器中的通用编程,用于模型和视图之间的接口

时间:2015-01-31 00:45:24

标签: c++ boost model-view-controller generic-programming

我正在用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;
         }
    }

3 个答案:

答案 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] 在远远超过去虚拟化的情况下发生的更多(复杂)案例