Rokiのチラ裏

学生による学習のログ

テンプレートプレディケートを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として用いたい場合、こういった明示的な記述が必要となる。