Виртуальные функции и шаблоны в C ++ - могут ли они быть заменены другими (существующими в C ++) операциями? - PullRequest
0 голосов
/ 28 мая 2010

Например, концепция шаблонов в C ++ удобна, поскольку компилятор генерирует дополнительный код для вашего класса или для вашей функции, не так ли? Таким образом, мы могли бы жить без шаблона, выполнив некоторые дополнительные (ручная работа).

А как насчет виртуальных функций ???

Есть ли ситуации, когда они оба незаменимы?

Ответы [ 5 ]

3 голосов
/ 28 мая 2010

Да, мы можем жить без шаблонов, выполняя больше ручной работы (напишите код, который пишет компилятор, или используйте void* для удаления спецификаций типа).

Да, мы можем жить без полиморфизма, делая больше ручной работы (используя операторы switch или сохраняя вашу собственную структуру vtable).

Есть ли случаи, когда они незаменимы?

Подходы на основе шаблонов и полиморфизма дают вам безопасность типов и принудительное поведение компилятора (например, чисто виртуальное), которое нельзя заменить некоторыми ручными методами. Например, std::sort безопаснее использовать, чем qsort, который работает на void*. Эти ручные методы могут привести к большому количеству кода, который должен быть без ошибок и поддерживаться. Так что это зависит от вашего определения «незаменимый». С этими функциями или без них эти языки по-прежнему завершены по Тьюрингу . Теоретически, вы можете вычислить все что угодно на полном языке Тьюринга, поэтому мы можем теоретически заменить все языки на BrainF * ck ... Мы просто решили не делать этого;)

2 голосов
/ 28 мая 2010

Это не совсем то же самое.

Шаблоны эффективно генерируют функции с различными сигнатурами во время компиляции. Вы можете довольно легко скопировать-вставить или сгенерировать все эквивалентные методы самостоятельно.

Виртуальные методы используются для принятия решений во время выполнения, поэтому, хотя они и облегчают работу программистов, их довольно сложно заменить. Вы не можете просто скопировать и вставить код для симуляции виртуальных функций, но вместо этого вам придется реализовать почти то же самое самостоятельно, используя таблицу таблиц указателей функций, похожую на vtable, или другой альтернативный подход.

Короче говоря, виртуальные функции значительно облегчают выполнение некоторых вещей, которые в противном случае были бы трудными, но это другой набор вещей, на которые не влияют шаблоны.

1 голос
/ 28 мая 2010

Конечно;до того, как полиморфизм стал доступен, и даже сейчас в коде людей, не понимающих полиморфизм, его место занимает Заявление о гигантском переключении.

0 голосов
/ 02 июня 2010

Я подозреваю, что вы могли бы делать все, что вам нужно было бы делать с операциями AND и NOT. Все остальное - соус.

0 голосов
/ 28 мая 2010

Я обнаружил, что можно использовать полиморфизм для достижения тех же целей, что и для шаблонов. Тем не менее, это, как вы подозреваете, требует больше работы. Есть и другие компромиссы, которые следует учитывать, включая производительность и ремонтопригодность. Они вступают в игру, когда я принимаю решение, в какую сторону идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...