Следующий код - это моя первая попытка C++ 11 по довольно печатанию итерируемых контейнеров. Он использует функцию параметра по умолчанию шаблона функции.неоднозначный оператор << для шаблонной перегрузки
#include <ostream>
#include <string>
#include <utility>
template <typename T>
void print(std::ostream &o, T const &t) { o<< t; }
void print(std::ostream &o, std::string const &s){ o<< '"'<< s<< '"'; }
template <typename K, typename V>
void print(std::ostream &o, std::pair<K, V> const &p)
{
o<< '{'; print(o, p.first);
o<< ": "; print(o, p.second);
o<< '}';
}
template <typename C, typename I= typename C::const_iterator>
std::ostream &operator<< (std::ostream &o, C const &c)
{
o<< '[';
if(c.empty()) return o<< ']';
I b= c.begin(), e= c.end(); -- e;
for(; b!= e; ++ b)
{
print(o, *b);
o<< ", ";
}
print(o, *b);
return o<< ']';
}
Он отлично работает на контейнерах, контейнер контейнеров и т.д. С одним исключением:
std::cout<< std::string("wtf");
компиляции с г ++ 4.7/8 брейки говоря ambiguous operator<<
.
Есть ли какие-либо исправления для этого кода, чтобы избежать двусмысленности?
Поскольку 'станд :: string' имеет' const_iterator ', ваш шаблон' operator <<' является совпадением. –
@VaughnCato да, я хотел бы, чтобы std :: basic_string перегрузка была предпочтительной, если это было возможно. –
nurettin
Вы можете использовать 'enable_if' для отключения вашей перегрузки, когда' C' является строкой. –