Я пытаюсь улучшить дизайн C ++, который я сделал, что включало то, что я воспринимаю как плохое решение. < /p>
Идея была следующей: < /p>
- Элемент < /code> базовый класс, унаследованный несколькими подклассами. /code> базовый класс, унаследованный несколькими подклассами. Drawhandler .
текущее временное решение
Surface поддерживает std :: vector
for(const auto& element: elements){
auto handler = Tester::getHandler(*element);
handler->draw(*this, *element);
}
tester :: gethandler метод-это то, чем я недоволен и делаю что-то похожее на:
static std::unique_ptr getHandler(const Element& element){
if (auto* c = dynamic_cast(&element)) {
return std::make_unique();
}
if (auto* c = dynamic_cast(&element)) {
return std::make_unique();
}
// ...
}
< /code>
сбои < /h2>
Я пробовал много вещей, но из-за моего неэкспертиза в C ++ я не смог добиться чего-либо лучше, чем упомянутое неидеальное Решение. Кроме того, если список возможных обработчиков растет (Drawhandler, ControlHandler, ...), то это означает, что мы должны реализовать новые методы Gethandlers в каждом из элементов подклассов.
[*] Я не смог использовать шаблоны в первый раз, я понял, что std :: vector < /code> стирает всю информацию типа в конкретное время, когда мы Нужно для шаблонов: < /p>
template
void drawElement(const ElementType& element){
// [ElementType == Element]
// Specialization is erased
}
void someFunc(){
// elements is vector
// we did push_back(Subclass1()) and other subclasses instances
for(const auto& element: elements){
drawElement(element);
}
}
Второй раз, когда я использовал шаблоны, я модифицировал элементы на вектор
< /li>
< /ol>
Но тогда, для человека, отвечающего за код редактирования, мы обменяли только «Добавление условного теста на Dynamic_casting» С «добавлением структуры в шаблон», который концептуально отличается и, возможно, предпочтительнее, но он страдает от той же подмножества проблем, которые мы имели с тем, что описано как текущее решение, и, кроме того, элементы должны быть Изменено в случае, если нам нужны новые типы обработчиков, чтобы расширить возможное поведение наших элементов . Например, если у нас есть четыре различных типа обработчиков: < /p>
vector elements;
< /code>
Вопрос < /h1>
То, что я ищу, - это шаблон, который позволил бы это: < /p>
Subtype1 x;
Handler[Draw[Subtype1]] handler1 ; // type :Subtype1DrawHandler
Subtype2 y;
Handler[Command[Subtype2]] handler2 ; // type : Subtype2CommandHandler
Handler[Draw[Subtype2]] handler3; // type Subtype2DrawHandler
< /code>
Это возможно с шаблонами, но: < /p>
...
...
...
surface.addElement(x);
surface.addElement(y);
surface.render();
...
...
...
Surface::render(){
// elements is vector
// Subtype1 and Subtype2 are obscured at the time
// we need them for templates
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... ptrbasecla
Мобильная версия