1

Я создаю структуру MVC для моего проекта на C++. Ниже приведен фрагмент источника контроллера/псевдокода. Как вы можете видеть, я должен поставить явную проверку для каждого типа. Я сохранил тип для каждого свойства объекта (модели). Есть ли способ избежать этого случая переключения?Общее программирование в контроллере для интерфейса между моделью и представлением

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

Пожалуйста, используйте этот шаблон функции вместо переключателя

template<typename T> 
    void func() 
    { 
    T value; 
    model->fetch(value, P->id); 
    writer->write(value, P->id); 
} 
+0

Но я бы все-таки нужно переключить заявление. – shampa

+0

@shampa вам не нужна инструкция switch. Вызвать функцию следующим образом func () – Steephen

+0

Мне все еще нужно связать свойство, соответствующее его типу. Я не могу связать базовый тип int, char * и т. Д. С собственностью. – shampa

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; 

} 
0

Где valueфактически пришел, потому что вы можете использовать, чтобы изгнать дженерики. Как указано, не существует способа предотвратить включение коммутатора, поскольку переключатель также определяет тип значения. Если заменить переключатель на вариант (если вы не хотите полиморфизм во время выполнения), вы можете сделать эту работу.

Проницательный читатель заметит, что, конечно, где-то внутри, переключатель типа все еще происходит. Существенные различия в том, что

  • варианты могут быть во время компиляции оптимизирована прочь [1], в этом случае переключатель типа не должен присутствовать в сгенерированном коде или быстрее

  • типа выключатель спрятан, программист думает на более высоком уровне абстракции

Это говорит о том, что если это приносит сложность, рассмотрите более простые варианты. Это может быть преждевременной оптимизации


[1] в гораздо более сложных() случаев, чем де-виртуализация обычно бывает

Смежные вопросы