続オートネゴシエーション

昨日の方針をさらに進めて、完全なオートネゴシエーションを考えていました。

namespace hamigaki { namespace audio {

template<class Source, class Sink>
std::streamsize copy(const Source& src, const Sink& sink)
{
    sink.format(src.format());
    return boost::iostreams::copy(src, sink);
}

} } // End namespaces audio, hamigaki.

namespace audio = hamigaki::audio;

int main()
{
    audio::copy(
        audio::vorbis_file_source("doremi.ogg"),
        audio::auto_nego<audio::pcm_sink>());
}

auto_negoの実装が面倒くさそうですが、こうすればフォーマットの受け渡しを自動化できます。
ただし、SourceとSinkにformatメンバが必要なので、loopやrestrictなどのアダプタをかぶせた場合が問題になります。
やっぱり、無理っぽいです。