M>Если тема заинтересовала , предлагаю подумать как реализовать функционал std::vector используя typedef и абстрактные интерфейсы. Сможете ли вы провести границу в этом случае? и насколько формальной такая граница может быть ?
тема безусловно интересная
функциональность std::vector используя typedef и абстрактные интерфейсы не сделать, если у нас нет настоящего параметрического полиморфизма как скажем в скале (или на худой конец в яве; еще и имплициты как в скале могут потребоваться для хорошего качества) или шаблонов (как в с++)
известные варианты без ПП -- это
1. коллекции из потомков Object-а, при доставании элемента требуется даункаст
2. интрузивные коллекции -- элементу, чтобы класться в коллекцию, требуется наследование от чего-то-там
но решения по поводу "а как реально программировать log_destination" лежит немного в стороне от этих важных моментов
если бы с++ был бы хорошим языком, то там бы не было проблемы "делать хорошо или, наоборот, делать быстро, удобно и понятно даже последнему юниору"; а в с++ эта проблема есть, так что приходится выбирать
скажем, мы выбрали хорошо (как сделаны потоки или std::vector) -- а как в таком случае, позвольте спросить, передать в функцию f пару std::vector<T*> так, что T *неизвестен*, но гарантированно *одинаков* у обоих векторов? и какая сигнатура будет у функции f? вот тут-то мы вспомни про старый добрый void*, слегка прикрытый шаблонами, или не вспомним, а?