Можно ли перегрузить оператор << для std :: map с парой std: string и std :: vector <int>? - PullRequest
0 голосов
/ 15 января 2019

Я ранее перегружал оператор << для std::map, используя template для std::map<std::string, int>

template <typename T, typename S> 
std::ostream & operator<<(std::ostream & os, const std::map<T, S>& v) 
{ 
    for (auto it : v)  
        os << it.first << " : " << it.second << "\n"; 

    return os; 
} 

Как можно написать шаблон, если, например, map было std::map< std::string, std::vector<int> >?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Есть несколько вариантов.

Сначала вы можете просто предоставить отдельную перегрузку operator<< для std::vector, т.е. g.:

template <typename T>
std::ostream& operator<< (std::ostream& s, std::vector<T> const& v)
{ /* your generic implementation */ return s; }

Затем он будет вызываться для каждого вектора на вашей карте:

os << it.first << " : " << it.second << "\n";
//                           ^ here...

Я считаю, что это самое чистое решение & ndash; но если он слишком универсальный, и вам нужно что-то действительно другое только для этого конкретного типа карты, то вы можете предоставить отдельную перегрузку исключительно для этого типа карты:

std::ostream& operator<<
        (std::ostream& s, std::map<std::string, std::vector<int>> const& m)
{ /* your specific implementation */ return s; }

или, альтернативно, выделите для этого своего оператора:

template <>
std::ostream& operator<< <std::string, std::vector<int>>
        (std::ostream& s, std::map<std::string, std::vector<int>> const& m)
{ /* your specific implementation */ return s; }
0 голосов
/ 15 января 2019

Возможно ли это? Да, вы можете написать код.

Это разрешено? Нет, это неопределенное поведение - расширять пространство имен std вашими собственными символами, если это не указано явно.

Глядя на ваш текущий подход, я бы не стал перегружать существующий метод. Я бы предоставил новый метод для пары.

...