std::char_traits?

sine_wave_sourceのアダプタを考えると、ストリームの文字型がcharなのは不便です。
計算はfloatやdoubleでやって、最後に量子化したほうが処理の無駄も少なく、簡潔に記述できるはずです。
(事実、内部的にはOgg Vorbisはfloatストリームです。他の音声圧縮もほとんど同じだと思います。)
そこでfloatを文字型とするストリームを作成するため、std::char_traits<float>を考えてみました。
実際には、基本型であるfloatではchar_traitsを特殊化することができないので、strong typedefしたfloat_typeを用います。
int_typeはoptional<float_type>にしてあります。

#include <boost/optional.hpp>
#include <boost/strong_typedef.hpp>
#include <string>

namespace hamigaki { namespace audio {
BOOST_STRONG_TYPEDEF(float, float_type);
} } // End namespaces audio, iostreams.

namespace std
{

template<>
struct char_traits<hamigaki::audio::float_type>
{
    typedef hamigaki::audio::float_type char_type;
    typedef boost::optional<char_type> int_type;
    typedef streamoff off_type;
    typedef streampos pos_type;
    typedef mbstate_t state_type;

    static void assign(char_type& c1, const char_type& c2)
    {
        c1 = c2;
    }

    // 以下略
};

} // namespace std

とりあえず、これでsine_wave_sourceを実装し直して、いろいろ試してみます。