SFINAE применяется к шаблонным методам.Вы не.
В C ++ 11 у нас может быть шаблон по умолчанию для функции, которая обрабатывает это:
template<typename First,
typename TypeToReturn = typename Holder<First>::type>
struct SuperClass
{
template <typename T = TypeToReturn>
typename boost::enable_if<boost::is_integral<T>, T>::type
operator()(int& someParameterNotImportant) const
{
// stuff
}
template <typename T = TypeToReturn>
const typename boost::disable_if<boost::is_integral<T>, T>::type&
operator()(int& someParameterNotImportant) const
{
// stuff
}
};
C ++ 17 допускает более простой синтаксис с if constexpr
,
и C ++ 20 позволяют requires
отказаться от метода благодаря чертам.
В C ++ 03 я бы предложил вместо этого диспетчеризацию тегов:
template<typename First,
typename TypeToReturn>
TypeToReturn helper(int& someParameterNotImportant, boost::true_type)
{
// stuff
}
template<typename First,
typename TypeToReturn>
const TypeToReturn& helper(int& someParameterNotImportant, boost::false_type)
{
// stuff
}
template<typename First,
typename TypeToReturn = typename Holder<First>::type>
struct SuperClass
{
typename boost::conditional<boost::is_integral<TypeToReturn>::value,
TypeToReturn,
const TypeToReturn&>::type
operator()(int& someParameterNotImportant) const
{
return helper<First, TypeToReturn>(someParameterNotImportant,
boost::is_integral<TypeToReturn>());
}
};