实现有限字符串格式化运算符以与&lt; <! - ? - >一起使用的有效方法

时间:2011-10-16 01:18:59

标签: c++ string-formatting iostream

我正在寻找以下内容:

string pearString ("pear");
string bananaString ("banana");

cout << ???? 5 ??? pearString ??????? << "[end]" << endl;
cout << ???? 5 ??? bananaString ??????? << "[end]" << endl;

将(对于某些代码字符序列???)输出:

pear[end]
banan[end]

但我希望这可以在不必执行复制字符串的子字符串操作的情况下工作。除非我遗漏了什么,否则没有格式说明符。 (setw说明符填充较短的字符串,但允许较长的字符串溢出。)

我想到的一个“棘手”的事情是使用自己的流输出操作符创建一个轻量级的包装器类。它将采用(非const)字符串引用和其结构中的限制。然后输出操作员将测试长度,如果小于或等于限制则执行标准输出。如果它更大,它会暂时在长度位置戳一个空字符,只需要足够长的时间来输出...然后将原始字符放回去。

更新: 实际上这个想法不会起作用<<忽略嵌入的空值。)

无论如何,它看起来的想法是:

cout << strlimiter(5, pearString) << "[end]" << endl;
cout << strlimiter(5, bananaString) << "[end]" << endl;

任何可以处理const字符串的清洁解决方案,并不会从你下面摆弄数据?使用延伸iostream的其他钩子或技巧的东西?这是否被图书馆所覆盖?


更新 :我忽略了write iostream的方法来代替<<,所以这里有一些示例代码:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

class strlimiter
{
    friend ostream& operator<< (ostream& os, strlimiter sl);

private:
    const string& data;
    size_t limit;

public:
    strlimiter(const string& data, size_t limit) : data(data), limit(limit) {}
    ~strlimiter() {}
};

ostream& operator<< (ostream& os, strlimiter sl) {
   return os.write(sl.data.c_str(), min(sl.data.length(), sl.limit));
}

int main() {
    string pearString ("pear");
    string bananaString ("banana");

    cout << strlimiter(pearString, 5) << "[end]" << endl;
    cout << strlimiter(bananaString, 5) << "[end]" << endl;

    return 0;
}

还有什么技巧可以让它在运行时更少成本?

2 个答案:

答案 0 :(得分:2)

对于您的包装器类,在重载operator<<中,而不是在字符串上使用<<,请使用ostream::write函数。

the_stream.write(the_string.c_str(), the_size);

答案 1 :(得分:2)

为什么不使用write的{​​{1}}成员函数:

ostream

也许令人惊讶的是,你甚至可以把它放在插入链的开头。以你的例子为基础,你可以使用以下有点复杂的链:

cout.write(bananaString.c_str(),5);