你可以編寫處理uint8_t
&朋友的自定義設備。這裏有一個例子:
template <typename Container>
class raw_back_insert_device
{
public:
typedef char char_type;
typedef typename Container::value_type raw_char_type;
typedef boost::iostreams::sink_tag category;
raw_back_insert_device(Container& container)
: container_(container)
{
}
std::streamsize write(char const* s, std::streamsize n)
{
auto start = reinterpret_cast<raw_char_type const*>(s);
container_.insert(container_.end(), start, start + n);
return n;
}
private:
Container& container_;
};
template <typename Container>
raw_back_insert_device<Container> raw_back_inserter(Container& cnt)
{
return raw_back_insert_device<Container>(cnt);
}
class raw_array_source : public boost::iostreams::array_source
{
public:
template <typename Char>
raw_array_source(Char const* begin, Char const* end)
: boost::iostreams::array_source(
reinterpret_cast<char const*>(begin),
reinterpret_cast<char const*>(end))
{
}
template <typename Char>
raw_array_source(Char const* begin, size_t size)
: boost::iostreams::array_source(
reinterpret_cast<char const*>(begin),
size)
{
}
template <typename Container>
raw_array_source(Container& container)
: raw_array_source(container.data(), container.size())
{
}
std::streamsize read(char* s, std::streamsize n)
{
auto i = input_sequence();
auto min = std::min(i.second - i.first, n);
std::copy(i.first, i.first + min, s);
return min;
}
};
template <typename Container>
raw_array_source raw_container_source(Container& container)
{
return raw_array_source(container);
}
你然後才能將如下所示:
typedef unsigned char uint8_t;
typedef boost::iostreams::stream<
boost::iostreams::code_converter<
raw_array_source,
std::codecvt<uint8_t, char, std::mbstate_t>
>
> array_stream;
array_stream s; //initialized properly in the code
unsigned char asd;
s >> asd;
std::cout << asd << std::endl;
所以我想原題的大局觀是,我想給的boost ::精神的無符號流字符解析。因此,每當我嘗試從流中讀取某些內容時都無法使用靜態代碼(不是我的代碼正在完成所有的閱讀)。 我最終通過廢除boost :: iostreams並使用spirit中基於迭代器的解析器來解決這個問題。 – Zsol 2010-08-28 16:15:36