template <template <typename, typename> class Container, typename T, class Alloc>
void print(Container<T, Alloc>&, string sep="", string end="\n")
{
std::copy(Container<T, Alloc>.begin(), Container<T, Alloc>.end(), std::ostream_iterator<T>(std::cout, sep));
std::cout << end;
}template <class Container>
void print(const Container& c, string sep=" ", string end="\n")
{
for (const auto& e : c)
std::cout << e << sep;
std::cout << end;
}template <class Container>
void print(const Container& c, string sep=" ", string end="\n")
{
std::ostream_iterator<typename Container::value_type>
out_it(std::cout, sep.c_str());
std::copy(c.begin(), c.end(), out_it);
std::cout << end;
}
template <typename T>
struct is_not_container
{
static const bool value = !has_const_iterator<T>::value ||
!has_begin_end<T>::beg_value || !has_begin_end<T>::end_value;
};template <class Container>
typename std::enable_if<is_container<Container>::value>::type
print(const Container& c, string sep=" ", string end="\n")
{
std::ostream_iterator<typename Container::value_type>
out_it(std::cout, sep.c_str());
std::copy(c.begin(), c.end(), out_it);
std::cout << end;
}
template<typename T>
typename std::enable_if<is_not_container<T>::value>::type
print(T value, string end="\n")
{
std::cout << value << end;
}я так понимаю удобство это не про С++
print(x) работало для любого типа, при этом контейнеры обрабатывались поэлементно, а не контейнеры - просто. При этом автор не хочет вручную писать все типы или в перегрузке или в инстанцировании шаблонов. И еще иметь возможность дополнительно передать функциям параметры форматирования (разные для контейнеров и нет).template <class Container>
void print(const Container& c, string sep=" ", string end="\n")Print( const TStorage<TItem, TAllocator>& storage ) имеет большую конкретику, шаблон Print( const TValue& value ) не вступает с ним в конфликт, т.к. является менее конкретным, т.е. более общим. Описанной тобой проблемы у меня нет.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 >