Меня не беспокоит использование C ++ в качестве чистого ОО-языка, если есть веские причины смешивать методы. (Напоминает о причинах использования GOTO, хотя и экономно.)
Я действительно не думал, что мне есть что предложить, пока я не увидел это. Я должен не согласиться с мнением. ООП - это только одна из парадигм, которые можно и нужно использовать в C ++. Честно говоря, на мой взгляд, это не одна из его сильных сторон.
С точки зрения ОО, я думаю, что C ++ на самом деле немного отстает. Например, идея иметь не виртуальные функции - это галочка против этого. У меня были споры с теми, кто не согласен со мной, но не виртуальные участники просто не соответствуют парадигме, насколько я обеспокоен. Полиморфизм является ключевым компонентом ОО, и классы с не виртуальными функциями не являются полиморфными в смысле ОО. Так что, как ОО-язык, я думаю, что C ++ на самом деле довольно слаб по сравнению с такими языками, как Java или Objective-C.
Обычное программирование, с другой стороны, в C ++ это довольно неплохо. Я слышал, там сказано, что есть и лучшие языки для этого, но комбинация объектов и универсальных функций - это нечто очень мощное и выразительное. Кроме того, он может быть чертовски быстрым как во время программирования, так и во время обработки. Я думаю, что именно в этой области светит C ++, хотя по общему признанию это могло бы быть и лучше (например, поддержка языков для концепций). Кто-то думает, что он должен придерживаться ОО-парадигмы и относиться к другим по порядку утверждения goto на уровнях безнравственности, действительно упускают из виду, не глядя на эту парадигму.
Возможность метапрограммирования шаблонов также впечатляет. Взгляните на библиотеку Boost.Units, например. Эта библиотека обеспечивает поддержку типов для размерных величин. Я широко использовал эту библиотеку в инженерной фирме, в которой я сейчас работаю. Это просто обеспечивает гораздо более немедленную обратную связь для одного аспекта возможного программиста или даже ошибки спецификации. Невозможно скомпилировать программу, использующую формулу, в которой обе стороны оператора '=' не являются размерно-эквивалентными без явного приведения. Лично у меня нет опыта работы с любым другим языком, на котором это возможно, и, конечно, не с языком, обладающим мощью и скоростью C ++.
Метапрограммирование - это чисто функциональная парадигма.
На самом деле, я думаю, что вы уже вступили в C ++ с некоторыми неудачными заблуждениями. Других парадигм, кроме ОО, не следует избегать, их нужно НАЧИСЛЯТЬ. Используйте парадигму, которая естественна для аспекта проблемы, над которой вы работаете. Не навязывайте объектам то, что по существу не является проблемой, склонной к объектам. Насколько я понимаю, OO - это еще не половина истории C ++.