【问题标题】:C++ basic custom cout printing to consleC++ 基本自定义 cout 打印到控制台
【发布时间】:2016-12-13 00:17:17
【问题描述】:
template<typename T, typename F, typename L>
void print(const T& s, F first, L last)
{
    os << s << " = (\n";

    os << charInput1;
    std::copy(first, last, std::ostream_iterator<int>(std::cout, "\n"));
    os << charInput2;

    os << "\n)";
}

我正在尝试进行自定义 cout 打印。该成员函数属于一个类CustomPrintercharInput1charInput2 是它的私有char 成员,这是我在构造自定义打印机时定义的。 firstlast 应该是迭代器,s 是一个字符串。

例如,假设charInput1+ 符号,charInput2 是句点.,我希望最终输出如下,给定std::vector&lt;int&gt; = {1, 1, 1}

(
+1.
+1.
+1.
)

但我得到了

(
+1
1
1
.
)

所以我的问题是,为了在每个向量元素之间打印给定的char,还需要什么?是否可以只使用std::ostream_iterator&lt;int&gt;(std::cout, /* char here? */)?因为这个方法好像只能在中间插入字符串,所以我也需要在之前插入。如果没有,有什么更好的方法?提前致谢!

编辑:我主要有

CustomPrinter cp(std::cout, '+', '.');
std::vector<int> v = {1, 1, 1};
cp.print("result", v.begin(), v.end()); // function call..

【问题讨论】:

  • 发布一个完整的、可编译的示例,说明如何调用此函数。
  • @latedeveloper 嗨,我已经添加了函数的调用方式。
  • 您为什么将&lt;int&gt; 硬编码为ostream_iterator 的类型名?它不应该来自类模板吗?
  • FL 设置两个模板参数真的有意义吗?它们不需要是相同的迭代器类型吗?也许您应该只为元素类型提供一个模板参数,并从中构建迭代器类型。然后,您也可以为 std::ostream_iterator 使用相同的类型名。

标签: c++ printing iterator pretty-print ostream


【解决方案1】:

只需使用普通循环:

template<typename T, typename F, typename L>
void print(const T& s, F first, L last)
{
    os << s << " = (\n";
    for (auto el = first; el != last; el++) {
        os << charInput1 << *el << charInput2 << "\n";
    }    
    os << ")";
}

实际上,您可以使用std::ostream_iterator,通过连接周围的字符来实现。

template<typename T, typename F, typename L>
void print(const T& s, F first, L last)
{

    std::string sep = charInput1 + std::string("\n") + charInput2;
    os << s << " = (\n";
    if (first != last) { // Don't print first prefix and last suffix if the sequence is empty
        os << charInput1;
        std::copy(first, last, std::ostream_iterator<int>(std::cout, sep.c_str()));
        os << charInput2;
    }
    os << "\n)";
}

【讨论】:

  • 谢谢!你的编辑真的很有帮助,也是我所寻找的,除了你对循环的建议之外,这当然也很有效。
  • 顺便说一句,您的编译器是否抱怨ostream_iterator(std::ostream&amp;, std::string&amp;)
  • 我没试过,但我现在看到delimiter 必须是char*,而不是std::string。我用.c_str() 得到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多