2

これは非常に基本的な質問かもしれませんが、STL リファレンスを掘り下げている間、適切なものが見つかりません。例として

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

One hundred and one: 101格納されます。oss数値101がテキストに変換されることを意味します。私が探しているのは、次のような数値を保持するストリーム オブジェクトです。

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

10のテキスト表現ではなく、これら 3 つの数値のみを含むバイトまたは文字列バッファーに0なります。15

これに何が使えるか考えていますか?

4

2 に答える 2

1

一連の整数を含むバッファがstd::vector<int> 制御します。

グローバル演算子をオーバーライドして、そのような操作が意味のある任意のコンテナ タイプに<<任意のタイプを追加できます。TC

#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と intiの場合、たとえば短縮できるようにする

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

に:

si << i << j << k;

あなたが得た簡潔さは、それ以外の熟練した読者にあなたの略語が何であるか、そしてそれらがどれほど安全であるかを研究させるという犠牲を払っていることを覚えておいてください.

に短縮si.push_back(i)することsi << iは価値がなく、1 行に の非常に長いシーケンスを取得したい場合は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;
于 2014-05-26T10:18:39.167 に答える
0

このセマンティック (ストリーム挿入)​​ では: いいえ、ありません。

あなたの例から、整数のベクトルを整数で埋めたいようです。

ostream のようなセマンティクスを vector-element-addition に変換するファンクター (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 メカニズム全体が実際には挿入/削除される単一の文字を処理します。

于 2014-05-26T08:08:14.170 に答える