"спортивное программирование" и олимпиады ничего не дадут ему в плане опыта реального программирования.
Ему будет крайне сложно работать в комманде над реальными программами,
потому что олимпиадники думают не тем местом и не о том
template <class Container>
typename std::enable_if<is_container<Container>::value>::type
print(const Container& c, string sep=" ", string end="\n")
...
template<typename T>
typename std::enable_if<is_not_container<T>::value>::type
print(T value, string end="\n")
template <class Container>
переписатьtemplate< typename TItem, typename TAllocator, template< typename, typename > class TStorage >
я так понимаю удобство это не про С++
print(x)
работало для любого типа, при этом контейнеры обрабатывались поэлементно, а не контейнеры - просто. При этом автор не хочет вручную писать все типы или в перегрузке или в инстанцировании шаблонов. И еще иметь возможность дополнительно передать функциям параметры форматирования (разные для контейнеров и нет).
Ваше приложение может само это делать во время установки или иметь в настройках галочку "сделать приложением по умолчанию"/"открывать ссылки bla-bla-bla://". Или дайте пользователю bat file, который запускае regedit. Но цивильнее менять реестр из запускаемого приложения.