处理数字的流对象



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

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

将导致One hundred and one: 101存储在oss中,这意味着数值101被转换为文本。我要找的是一个流对象,它保持数值,这样就像:

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

将产生一个字节或字符串缓冲区,其中不包含10, 015的文本表示,而只包含这三个数字。

你知道这可以用什么吗?

包含一个整数序列的缓冲区是std::vector<int>控制。

可以覆盖全局操作符<<来追加将任意类型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;
}

但是,如果所有您想要实现的是缩写,例如

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 << 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;

使用这个语义(流插入):no there isn't

从你的例子中,看起来你想用整数填充一个整数向量。

你将需要一个函子(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;
}

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

相关内容

  • 没有找到相关文章

最新更新