diff --git a/Modules/Core/Functor/include/otbFunctorImageFilter.h b/Modules/Core/Functor/include/otbFunctorImageFilter.h index 073944cf4d25016b7949c28e8070df7f8bdd4f48..3d46b8633bcf5d6b4ebc3dcb7ff2a26e80b9e2d2 100644 --- a/Modules/Core/Functor/include/otbFunctorImageFilter.h +++ b/Modules/Core/Functor/include/otbFunctorImageFilter.h @@ -118,6 +118,20 @@ template <class T> struct ImageTypeDeduction<itk::VariableLengthVector<T>> /// that has std::remove_cvref) template <typename T> using RemoveCVRef = typename std::remove_cv<typename std::remove_reference<T>::type>::type; +/** +* \struct RetrieveOperator +* +* \brief Struct to retrieve the operator type +* +* \tparam T the type to retrieve operator() from +* +*/ +template <typename T> struct RetrieveOperator +{ + static_assert(std::is_class<T>::value || std::is_function<T>::value, "T is not a class or function"); + using Type = decltype(&T::operator()); +}; + /** * \struct FunctorFilterSuperclassHelper * \brief Struct allowing to derive the superclass prototype for the @@ -130,7 +144,7 @@ template <typename T> using RemoveCVRef = typename std::remove_cv<typename std:: * - InputHasNeighborhood a tuple of N false_type or true_type to denote * - if Ith arg of operator() expects a neighborhood. */ -template <typename T, typename TNameMap> struct FunctorFilterSuperclassHelper : public FunctorFilterSuperclassHelper<decltype(&std::remove_reference<T>::type::operator()),TNameMap> {}; +template <typename T, typename TNameMap> struct FunctorFilterSuperclassHelper : public FunctorFilterSuperclassHelper<typename RetrieveOperator<T>::Type,TNameMap> {}; namespace functor_filter_details { @@ -362,11 +376,10 @@ template <typename Functor, typename TNameMap> auto NewFunctorFilter(Functor f, * It is used internally in NewFunctorFilter version with * numberOfOutputBands parameter. */ -template <typename F> struct NumberOfOutputBandsDecorator : F +template <typename F> struct NumberOfOutputBandsDecorator : public F { public: constexpr NumberOfOutputBandsDecorator(F t, unsigned int nbComp) : F(t), m_NumberOfOutputBands(nbComp) {} - using F::operator(); constexpr size_t OutputSize(...) const { diff --git a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx index f7b9950ae9195234dc3905a49f7afdf027209751..add3fadcc4e18acef2bd4acb837fa2c93b3567e1 100644 --- a/Modules/Core/Functor/include/otbFunctorImageFilter.hxx +++ b/Modules/Core/Functor/include/otbFunctorImageFilter.hxx @@ -141,7 +141,9 @@ template <typename T> struct GetProxy<itk::ConstNeighborhoodIterator<T> > } }; -template <class Oper> struct OperProxy : public OperProxy<decltype(&std::remove_reference<Oper>::type::operator())> {}; +/// Proxy for operator (dispatch between void operator()(Out & +/// out,...) and Out operator()(...) +template <class Oper> struct OperProxy : public OperProxy<typename RetrieveOperator<Oper>::Type> {}; template<class Out, class ... In> struct OperProxy<Out(*)(In...)> {