Thank you Steven for your reply. It works great.
Here is what I finally did:
// struct histogram_functor
typename boost::enable_if< boost::mpl::contains< boost::mpl::transform<gray_image_types,add_view_type<boost::mpl::_1> >::type,
ViewType>,
result_type>::type operator()(const ViewType& v) const
{
// ...
}
template<class ViewType>
typename boost::enable_if< boost::mpl::or_< boost::mpl::contains< boost::mpl::transform< rgb_image_types,
add_view_type<boost::mpl::_1 > >::type,
ViewType>,
boost::mpl::contains< boost::mpl::transform< rgba_image_types,
add_view_type<boost::mpl::_1 > >::type,
ViewType>
>,
result_type>::type operator()(const ViewType& v) const
{
// ...
}
// ...
template <typename ImageType>
struct add_view_type
{
typedef typename ImageType::view_t type;
};
However, I have one other need: type reduction. For instance, all rgb image types have the same overload operator(). I do not know if the solution I came up instantiate the operator for all types, but if it is the case, it is a valid but not a good solution. What I need is to have the same operator() for all rgb types. I have read in a paper from L .Bourdev (www.lubomir.org/academic/MinimizingCodeBloat.pdf) that I could use type reduction, but I need some help. Can you help ?
Here is the definition of rgb_image_types:
#define RGB_IMAGE_TYPES (boost::gil::rgb8_image_t)(boost::gil::rgb16_image_t)(boost::gil::rgb32_image_t)
typedef boost::mpl::vector< BOOST_PP_SEQ_ENUM( RGB_IMAGE_TYPES ) > rgb_image_types;
Best regards,
Olivier