読者です 読者をやめる 読者になる 読者になる

Oven移植のレビュー状況

C++

http://thread.gmane.org/gmane.comp.lib.boost.devel/231185/focus=231432


regular()が出力する型のindirect_functor関数オブジェクトが、boost::result_of (nullary callable)に対応してないという指摘をされたので直しました。そういえばOvenでも前にやりましたね。
boost::result_ofはデフォルトでvoidになるので、decltypeベースじゃない場合は特殊な関数オブジェクトを作る場合は、boost::result_ofを0引数関数オブジェクトの型で特殊化する必要があります。


indirect_functorはFをboost::optional f;にして(*f)(args...);のようにして関数呼び出しをしてるので、以下のように特殊化してます。

template <class P>
struct pointer_value {
    typedef typename P::value_type type;
};

namespace boost {
    template <class F>
    struct result_of<indirect_functor<F>()> {
        typedef typename boost::result_of<
            typename pointer_value<F>::type()
        >::type type;
    };
}

実際のコードは以下を参照:
indirect_functor.hpp


それともう一件。
http://thread.gmane.org/gmane.comp.lib.boost.devel/231185/focus=231432

oven::copied相当の機能として、as_containerというのを用意してるのですが、コンストラクタ呼び出し構文と、代入演算子に対応したいという要望が出てます。

boost::array<int, 3> ar = {{1, 2, 3}};
std::vector<int> v(ar | as_container);
boost::array<int, 3> ar = {{1, 2, 3}};
std::vector<int> v;
v = ar | as_container; // C++11だとinitializer_listと曖昧になる

現状、どうすれば実現できるのか見当もつかないので悩み中。as_containerはファーストリリースに含めない予定なので、あとでexperimentalディレクトリを作ってとりあえず移動しておきます。