Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Так это нормально, что редкие в применении особенности мало кто держит в оперативной памяти. Но повторю: пока еще никто здесь не привел примера, в котором обсуждаемая особенность применялась бы иначе, как для спасения изначально неудачного кода. На каком основании ее тут возводят в ранг "каждый обязан знать!"?
Представим себе некий фреймворк, предоставляющий каркас сериализатора (перевод значений в бинарь и обратно). Его пользователем назовем программиста, который в своей прикладухе имеет всякие типы, значения которых ему нужно сериализовать. Вот в таком аспекте можно рассмотреть пример, в котором обсуждаемая особенность применяется для того чтобы "обеспечить свободу и гибкость пользователю фреймворка", а не для "спасения изначально неудачного кода"
https://github.com/vopl/dci-core-stiac/blob/master/include/dci/stiac/serialization/arch.ipp#L54
Упомянутые "свобода и гибкость" реализуются тем что прикладному программисту можно использовать как нешаблонные (в простых случаях) функции save/load, так и шаблонные, если типы сериализуемых значений носят какой нибудь комплексный характер (например как std::vector<E>) или обобщенный (например как обобщенный сериализатор для "такого то семейства перечислений")
-- добавлено позже
пример
нешаблонного стиля для простых случаев
пример
шаблонного для сложного значения
пример
шаблонного для обобщенного
и прикладник сам может выбирать что ему использовать, просто нешаблонную перегрузку или шаблонную