Я бы сказал, что при хорошем дизайне невозможно полностью избежать литья, потому что есть разумные случаи, когда литье - хороший выбор.Прокси чрезвычайно полезны и, как правило, полагаются на неявное или явное приведение, такое как следующее, которое выполняет ленивую оценку.
template <class fn_t, class result_t>
class lazy_t {
fn_t fn_;
public:
lazy_t(fn_t fn) : fn_ (fn) { }
operator result_t () { return fn_(); }
};
В этом случае компилятор может использовать неявное приведение для выполнения отложенной оценки данной функции.Я считаю, что оператор преобразования является частью открытого интерфейса класса.
dynamic_cast <> также необходим в некоторых случаях, таких как реализация множественной диспетчеризации.Подробнее см. http://en.wikipedia.org/wiki/Multiple_dispatch.
Иногда ваши программы требуют сложного кода.Вы не всегда можете просто придерживаться простых, базовых или «чистых» элементов языка.