簡體   English   中英

我可以使用std :: copy復制到stringstream中

[英]can I use std::copy to copy into stringstream

我最近有這樣的情況,我想將int64_t值的原始字節轉換為字符串流。 在C ++ 17中,我可以執行以下操作:

uint64_t val = 1984;
std::stringstream sstr;
sstr << "the byte value is " << std::string_view(reinterpret_cast<char*>(&val), sizeof(decltype(val)));

鮑勃是你的叔叔。 但我需要用C ++ 98或者C ++ 11來實現。 我想要做以下事情:

std::copy(reinterpret_cast<const char*>(&tmp_time),
          reinterpret_cast<const char*>(&tmp_time) + sizeof tmp_time,
          std::back_inserter(sstr));

但是在實例化back_inserter時g ++抱怨在basic_stringstream沒有名為value_type類型。

我可以不std::copystringstream對象嗎? 我該怎么做呢? 注意上面是一個簡單的例子,我不願意放棄流式語義,因為它們在真實環境中非常整潔。

您可以使用std::ostream_iterator

std::stringstream ss;
std::copy(reinterpret_cast<const char*>(&tmp_time),
          reinterpret_cast<const char*>(&tmp_time) + sizeof tmp_time,
          std::ostream_iterator<int>(ss, " "));

您需要決定使用它的類型。 我使用int將值打印為有符號整數,並使用一個空格作為分隔符。 您可以根據您想要達到的目標選擇其他內容。

使用std::back_inserter不適用於流,因為它的目的是對容器進行操作。 它創建了std::back_inserter_iterator ,它在傳遞的容器上調用push_back成員函數。 它還假設Container具有成員類型value_typeconst_reference和其他(您可以在此處查看它們的使用方式)。

這里有一個例子: std::back_inserter返回的迭代器有operator=定義:

back_insert_iterator<Container> &operator=(typename Container::value_type &&value);

因為std::stringstream沒有定義value_type ,編譯失敗。

您不需要使用std::copy()或任何其他算法。 您可以使用流自己的write()方法,例如:

uint64_t val = 1984;
std::stringstream sstr;
sstr << "the byte value is ";
sstr.write(reinterpret_cast<char*>(&val), sizeof(val));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM