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 ライブラリは近々公開予定