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

operator| の汎用化

ADL を使って operator| を汎用化できました

#ifndef SHAND_EXTENSION_INCLUDE
#define SHAND_EXTENSION_INCLUDE

#include <algorithm>
#include <functional>

namespace shand {
    namespace extension {
        // range algorithm
        struct sort_t {
            typedef void result_type;

            template <class Range>
            void operator()(Range& r) const
            {
                std::sort(r.begin(), r.end());
            }
        };
        const sort_t sort_ = {};

        // operator|
        template <class Range, class Func>
        typename std::tr1::result_of<Func(const Range&)>::type
            operator|(const Range& r, Func f)
        {
            return f(r);
        }

        template <class Range, class Func>
        typename std::tr1::result_of<Func(Range&)>::type
            operator|(Range& r, Func f)
        {
            return f(r);
        }

    } // namespace extension

    using extension::sort_;

} // namespace shand


#endif // SHAND_EXTENSION_INCLUDE
#include <iostream>
#include <vector>
#include <algorithm>
#include <shand/extension.hpp>

using namespace std;
using namespace shand;

int main()
{
    vector<int> v;

    v.push_back(3);
    v.push_back(1);
    v.push_back(4);

    v|sort_; // shand::extension::operator|(v, shand::sort_);

    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
        // 1, 3, 4

    return 0;
}

昨日の result_of での戻り値型を組み合わせれば
PStade.Oven のような Range-base ライブラリを作れます


私が作った Range-base ライブラリは近々公開予定