Я хочу напечатать пару, например
std::cout << make_pair(std::string,int) << endl;
Но он не компилируется, потому что operator<<(ostream &, std::pair<std::string,int>)
не определен.
Но поскольку теперь мы имеем С++ 11 с лямбда-функциями, я могу использовать лямбда-функции с выражением for_each
для работы с контейнерами.
В приведенном выше случае, как я могу предоставить "метод на месте", который может использоваться ostream для печати пары?
Пары (и другие кортежи) на самом деле не похожи на контейнеры, потому что их элементы имеют гетерогенные типы. Их нельзя повторять обычным способом. Так что лямбда здесь не применима.
Если вы хотите, просто определите output_pair
шаблона output_pair
которая принимает ostream и пару и выводит два элемента пары. Или, если вы хотите сохранить стиль извлечения, вы можете иметь output_pair
return output_pair_struct
который ничего не делает, кроме как удерживать копию кортежа, и определить оператор << на output_pair_struct
который сделал фактическую работу, чтобы вы могли иметь std::cout << output_pair(mypair) << endl;
,
pair printing function
где я создаю пару. и использовать его немедленно в cout
std::cout << pair.first << pair.second
... какие недостатки имеет эта строка кода, которую вы пытаетесь устранить?
В приведенном выше случае, как я могу предоставить "метод на месте", который может использоваться ostream для печати пары?
auto print = [&](const std::pair<std::string,int>& p) {
std::cout << p.first << ", " << p.second << "\n";
};
std::map<std::string,int> sequence = { /* ... */ };
for_each(sequence.begin(), sequence.end(), print);
for(const auto& p: sequence)
print(p);
или:
for_each(sequence.begin(), sequence.end(),
[&](const std::pair<std::string,int>& p) {
std::cout << p.first << ", " << p.second << "\n";
});
В любом случае, это слишком сложно. Вы должны написать так:
for(const auto& p: sequence)
std::cout << p.first << ", " << p.second << "\n";
ostream& operator<<(ostream&, pair<string,int> const&);
?