用于构建

时间:2016-12-13 00:17:17

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

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<int> = {1, 1, 1}

(
+1.
+1.
+1.
)

但是我得到了

(
+1
1
1
.
)

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

编辑:在我的主要内容中我有

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

1 个答案:

答案 0 :(得分:0)

只需使用普通循环:

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)";
}