テンプレートプレディケートをCompareに渡す
一応まとめておく。
当然だが、インスタンス生成されていないテンプレート関数を推測するのは不可能である。そういった場合は、明示的にキャストをする。
#include<array> #include<boost/range/algorithm_ext/iota.hpp> #include<boost/range/algorithm/copy.hpp> #include<boost/range/algorithm/sort.hpp> #include<iostream> #include<functional> #include<experimental/iterator> template<class Container,class Function> inline void permutation(Container&& c,Function&& func) { do{ boost::copy(std::forward<Container>(c),std::experimental::make_ostream_joiner(std::cout," ")); std::cout<<std::endl; }while(func()); } int main() { std::array<int,3> ar; boost::iota(ar,0); using stl_permutation_type=bool(*)(decltype(ar)::iterator,decltype(ar)::iterator); permutation(ar,std::bind(static_cast<stl_permutation_type>(std::next_permutation),std::begin(ar),std::end(ar))); boost::sort(ar,std::greater<decltype(ar)::value_type>()); permutation(ar,std::bind(static_cast<stl_permutation_type>(std::prev_permutation),std::begin(ar),std::end(ar))); }
標準ライブラリ関数など汎用化された非メンバ関数/メンバ関数をプレディケート/Compareとして用いたい場合、こういった明示的な記述が必要となる。