gpt4 book ai didi

c++ - 使用 std::range::copy 和适配器打印 std::map

转载 作者:行者123 更新时间:2023-12-04 15:03:49 26 4
gpt4 key购买 nike

仍在努力学习如何使用模板、概念和约束。我想使用 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;
}
};

这适用于看起来像这样的 map :

std::map<int,int> m1;
std::ranges::copy(m1,
std::ostream_iterator<
pair_adaptor<decltype(*m1.begin())> >(std::cout, "\n"));

现在,我想进一步扩展它,以便我可以打印如下所示的 map :

std::map<int, std::pair<int, int>>

所以,我认为我需要能够递归打印对,但我迷路了。

最佳答案

问题是你的 PrintablePair理念requires那个类型Tfirst_typesecond_type应该是可打印的,你的 pair_adaptor模板参数必须满足 PrintablePair概念。

但是当你取 std::pair<int, std::pair<int, int>>作为pair_adaptor的论点,second_type这是std::pair<int, int>不可打印,除非我们将其转换为 pair_adaptor<std::pair<int, int>> .

另一种解决方案是我们可以定义一个 std::pair概念第一:

template <class P>
concept Pair = std::same_as<std::pair<
typename P::first_type,
typename P::second_type>,
P>;

然后当我们遇到 std::pair ,我们只是把它改成pair_adaptor :

template <class T>
concept Printable = requires(std::ostream& os, T a) { os << a; };

template <Pair 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& d) {
auto print = [&out]<typename T>(const T& x) {
if constexpr (Pair<T>) out << pair_adaptor<T>{x};
else {
static_assert(Printable<T>);
out << x;
}
};

const pair_type& m = d.m;
out << "(";
print(m.first);
out << " => ";
print(m.second);
out << ")";
return out;
}
};

直播demo (Examples steal from @Rost) .

关于c++ - 使用 std::range::copy 和适配器打印 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66508325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com