operations
フォーマット取得操作をBoost.Iostreamsのオペレーション関数(readやoptimal_buffer_size等)のように実装中です。
Boost.Iostreamsでは、デバイスTに関するオペレーションをカスタマイズしたい場合は、operations<T>を特殊化するようになっています。
operations<T>のデフォルト実装は、
template<typename T> struct operations : detail::custom_tag { };
となっていて、カスタマイズされているかどうかは
template<typename T> struct is_custom : mpl::not_< is_base_and_derived< custom_tag, operations<T> > > { };
で判断されます。
注意すべき点は、オペレーションのカスタマイズは個々のオペレーションに対して行うのではなく、サポートする全てのオペレーションに影響があるということです。
read()だけカスタマイズしたい場合でも、write()やclose()なども(必要ならば)実装しなければなりません。
ドキュメントに記述がないので推測ですが、唯一の使用例であるmapped_file.hppを見る限り、
template<> struct operations<boost::iostreams::mapped_file_source> : detail::close_impl<closable_tag> { static std::pair<char*, char*> input_sequence(boost::iostreams::mapped_file_source& src) { return std::make_pair( const_cast<char*>(src.begin()), const_cast<char*>(src.end()) ); } };
のように、detail::close_impl<closable_tag>から派生させることで、規定の動作を使うように指示できるようです。
もう少し調査が必要ですが、今回はこのカスタマイズの仕組みを利用してみます。