【问题标题】:Stream object that handles numbers处理数字的流对象
【发布时间】:2014-07-14 22:09:10
【问题描述】:

这可能是一个非常基本的问题,但是在挖掘 STL 参考资料时,我找不到任何合适的东西。举个例子

std::ostringstream oss;
oss << "One hundred and one: " << 101;

将导致One hundred and one: 101 存储在oss 中,表示将数值101 转换为文本。我正在寻找的是一个保持数值的流对象,例如:

numstream nums;
nums << 10 << 0 << 15;

将导致字节或字符串缓冲区不包含 10015 的文本表示,而只包含这三个数字。

知道什么可以用来做这个吗?

【问题讨论】:

  • 听起来您可以先使用vector&lt;int&gt; 来存储数据。
  • 查看Boost.Assign 了解允许速记插入向量的库。
  • 你到底为什么想要那个?

标签: c++ stl stream bytestream


【解决方案1】:

有了这个语义(流插入):不,没有。

从您的示例看来,您想用整数填充整数向量。

您将需要一个仿函数(ostream 操纵器),它将类似 ostream 的语义转换为向量元素加法。

类似的东西:

struct functor {
   functor(std::vector<int>& viref):
      myVector(viref)
   {}
   // this operator overload translates stream-insert operator
   // into vector element addition
   functor& operator<<(const int i) {
      myVector.push_back(i);
      return *this;
   }
   std::vector<int>& myVector;
};

int main() {
   std::vector<int>   vi;
   functor            f( vi );

   f << 1 << 2 << 3;
}

或者,您总是可以编写自己的流缓冲区类 (http://www.cplusplus.com/reference/streambuf/streambuf/),但我怀疑这会很好,因为整个字符串/流 buf 机制实际上是为了处理插入/删除的单个字符。

【讨论】:

    【解决方案2】:

    包含整数序列的缓冲区是std::vector&lt;int&gt; 控制。

    您可以覆盖全局运算符&lt;&lt; 以追加 任何类型 T 到任何容器类型 C 进行此类操作 有意义的:

    #include <vector>
    #include <iostream>
    
    std::vector<int> & operator<<(std::vector<int> & vi, int i)
    {
        vi.push_back(i);
        return vi;
    }
    
    int main()
    {
        std::vector<int> vi;
        vi << 1 << 2 << 3;
        for(auto i : vi) {
            std::cout << i << std::endl;
        }
        return 0;
    }
    

    但是,如果all你想要实现的是一个缩写,例如

    si.push_back(i);
    

    对于一些整数序列si 和 int i,并且能够缩短,例如

    si.push_back(i);
    si.push_back(j);
    si.push_back(k);
    

    到:

    si << i << j << k;
    

    请记住,您获得简洁的代价是 让其他熟练的读者研究你的缩写是什么 - 以及它们的安全性。

    我建议将si.push_back(i) 缩短为si &lt;&lt; i 是不值得的 并且如果您想将冗长的push_back(n) 序列放到 一条线,那么定义就足够了,而且不那么古怪 用于此目的的类型安全的可变参数函数模板,例如

    void push_back(std::vector<int> & vi){}
    
    template<typename ...Ts>
    void push_back(std::vector<int> & vi, int i, Ts... ts)
    {
        vi.push_back(i);
        if (sizeof...(Ts)) {
            push_back(vi,ts...);
        }
    }
    

    你会写什么,例如

    push_back(si,i,j,k);
    

    而不是:

    si << i << j << k;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2018-04-04
      • 2015-09-13
      • 2014-12-16
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多