我希望能够使用 boost::enable_if
来关闭/打开某些方法。
对于整数类型,我想从 operator()
返回 TypeToReturn
对于其他类型,我想返回 const TypeToReturn&
这是我的尝试:
template<typename T>
struct Holder{
typedef T type;
};
template<typename First,
typename TypeToReturn = typename Holder<First>::type>
struct SuperClass{
typename boost::enable_if<boost::is_integral<TypeToReturn> >::type
operator()(int& someParameterNotImportant) const
{
// stuff
}
const typename boost::disable_if<boost::is_integral<TypeToReturn> >::type&
operator()(int& someParameterNotImportant) const
{
// stuff
}
};
我收到无法重载这些函数等错误。
我什至不确定这次尝试是否朝着好的方向迈出了一步。
编辑:根据第一个建议,我在更正后添加代码, 仍然存在“const typename boost::disable_if..... 无法重载”的问题
template<typename T>
struct Holder{
typedef T type;
};
template<typename First,
typename TypeToReturn = typename Holder<First>::type>
struct SuperClass{
typename boost::enable_if<boost::is_integral<TypeToReturn>, TypeToReturn >::type
operator()(int& someParameterNotImportant) const
{
// stuff
}
const typename boost::disable_if<boost::is_integral<TypeToReturn>, TypeToReturn >::type&
operator()(int& someParameterNotImportant) const
{
// stuff
}
};
最佳答案
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 将允许要求
由于特征而放弃该方法。
在 C++03 中,我建议改用标签分派(dispatch):
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>());
}
};
关于c++ - 成员函数上的 boost::enable_if,重载返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977220/