【问题标题】:Overloading std::array << operator重载 std::array << 运算符
【发布时间】:2021-10-25 12:52:23
【问题描述】:

我在尝试为 std::array 重载运算符

std::ostream& operator<<(std::ostream& os, std::array<int> const& v1)
{
    for_each(begin(v1), end(v1), [&os](int val) {os << val << " "; });
    return os;
}

但编译器希望我添加有关数组大小的信息,这不会使其成为任何整数数组的通用解决方案。我知道如果我想将其用于一般类型,我将不得不使用模板,但现在我只想将其用于整数数组。

【问题讨论】:

  • 只使用std::vector&lt;int&gt; 怎么样?我怀疑您是否追求std::array 的分配性能,因此使用动态大小数组是最简单的
  • @AlexeyLarionov 我知道我可以为向量做到这一点,我只是好奇如何为 std::array 做到这一点,因为我刚刚开始了解这个集合
  • 每个不同大小的数组都是不同的类型,所以你必须使用模板
  • std::array&lt;int&gt; 不是一个类型(就像std::array&lt;int, 4&gt; 一样)。您需要使用模板而不是普通函数。
  • 顺便说一句:IMO for (const auto &amp; val : v1) { os &lt;&lt; val &lt;&lt; " "; } 会更具可读性。

标签: c++ c++11 c++14


【解决方案1】:

模板不仅适用于“一般类型”。 std::array 在它所拥有的类型以及数组的大小上都被模板化了。因此,如果您希望运算符适用于任何大小的 int 数组,则需要对其进行模板化:

template <std::size_t N>
std::ostream& operator<<(std::ostream& os, std::array<int, N> const& v1)
{
    for_each(begin(v1), end(v1), [&os](int val) {os << val << " "; });
    return os;
}

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多