template< class SinglePassReadableIterator , class IncrementableWritableIterator , class SequenceMetaFunctionClass > void algorithm_using_temporary_buffer( SinglePassReadableIterator first, SinglePassReadableIterator last , IncrementableWritableIterator dest , boost::mpl::identity<SequenceMetaFunctionClass> ) { typedef typename boost::iterator_value<SinglePassReadableIterator>::type value_type; typedef typename boost::mpl::apply<SequenceMetaFunctionClass, value_type>::type sequence_type; sequence_type temporary_buffer; // ごにょごにょ } // デフォルトのバッファ型を使用するインタフェース template< class SinglePassReadableIterator , class IncrementableWritableIterator > void algorithm_using_temporary_buffer( SinglePassReadableIterator first, SinglePassReadableIterator last , IncrementableWritableIterator dest ) { algorithm_using_temporary_buffer( first, last, dest , boost::mpl::identity< std::vector<boost::mpl::_1> >()); }
ふつーはこういうことするときにはアロケータを指定するんだけれど,
- 内部で一時バッファとして使われるシーケンスの種類自体を外側から取り替えたい
- バッファの長さの上限に責任を持てるなら,自動変数を一時バッファとして使わせたい(カスタマイズしたアロケータでできそうに見えるけれど,そういうアロケータの設計・実装は直感ほど簡単ではなく結構面倒くさいことを考えないといけない)
という要求を加味してこんなのどうですかぁ?という提案.ちなみに Boost.Array は Sequence のモデルではない(特に初期化と挿入の操作において Sequence ではない)ので,自動変数として内部バッファを確保させたい場合,そういう Sequence のモデルを新たに実装しないといけないけれど.
#っつーかホンマにそれ実装できるんか?
もちろん,下のような感じでテンプレート引数を partial evaluation することもできますよ〜,と.
algorithm_using_temporary_buffer( first, last, dest , boost::mpl::identity< std::vector<boost::mpl::_1, MyAllocator> >());
boost::mpl::identity は Loki でいうところの Type2Type の役割ね.