
Hi all, I am currently trying to write a simple functor, and I would like to have the same overload for the operator () for all types in a mpl::vector. // Types definitions // Gray image types typedef boost::mpl::vector< boost::gil::gray8_image_t , boost::gil::gray16_image_t , boost::gil::gray32_image_t, boost::gil::gray32F_image_t , boost::gil::gray64F_image_t > gray_image_types; // RGB image types typedef boost::mpl::vector< boost::gil::rgb8_image_t , boost::gil::rgb16_image_t , boost::gil::rgb32_image_t > rgb_image_types; // Functor to compute min / max of an image over channels struct pixel_compare_less { template <typename PixelType> bool operator()( const PixelType& p1 , const PixelType& p2 ) const { return at_c<0>(p1) < at_c<0>(p2); } }; struct any_view_min_max { typedef std::pair<float, float> result_type; template <typename View> result_type operator()(const View& v) const { typedef typename View::iterator iterator; std::pair< iterator, iterator > result = boost::minmax_element( v.begin() , v.end() , pixel_compare_less() ); return std::make_pair( *(result.first) , *(result.second) ); } }; This works fine for 'gray_image_types', but need to be specialized for types in rgb_image_types. The specialization is the same, so, I am looking for an automated way to do this. "Manually", I can write this: template <> any_view_min_max_optimized::result_type any_view_min_max_optimized::operator()<rgba8_view_t>(const rgb8_view_t& v) const { // ... } template <> any_view_min_max_optimized::result_type any_view_min_max_optimized::operator()<rgba16_view_t>(const rgb16_view_t& v) const { // ... } And so on ... Could you help me to have an efficient way to do this for all types 'rgb_image_types' without writing each specialization ? Regards, Olivier