【发布时间】:2021-03-06 17:02:49
【问题描述】:
仍在尝试学习如何使用模板、概念和约束。
我想用std::ranges::copy() 打印出std::map 的内容,我看到了answer。印象深刻,我想知道我是否可以将pair_adaptor 限制为仅在元素可打印的std::pairs 上工作。
所以,我写了这个:
template <class T>
concept PrintablePair = requires(std::ostream & os, T a)
{
os << a.first;
os << a.second;
};
template <PrintablePair pair_type>
class pair_adaptor
{
public:
const pair_type& m;
pair_adaptor(const pair_type& a) : m(a) {}
friend std::ostream& operator << (std::ostream& out,
const pair_adaptor <pair_type>& d)
{
const pair_type& m = d.m;
return out << m.first << " => " << m.second;
}
};
这适用于如下所示的地图:
std::map<int,int> m1;
std::ranges::copy(m1,
std::ostream_iterator<
pair_adaptor<decltype(*m1.begin())> >(std::cout, "\n"));
现在,我想进一步扩展它,以便可以打印如下所示的地图:
std::map<int, std::pair<int, int>>
所以,我认为我需要能够递归打印对,但我迷路了。
【问题讨论】:
-
蓝图:定义一个
Printable概念。现在将pair_adaptor更改为具有两个特化的通用模板,现有一个用于PrintablePair,一个用于Printable。写出来的代码太多了,但这是通用的方法。
标签: c++ templates constraints c++20 c++-concepts