[英]boost::enable_if on member function, overload return type
我希望能够使用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
}
};
if constexpr
,C ++ 17将允许更简单的语法,
和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>());
}
};
您需要为enable_if提供一个类型
typename boost::enable_if<boost::is_integral<TypeToReturn>, TypeToReturn >::type
否则默认为无效
为了使它真正起作用,你需要自己创建运算符的模板函数,以允许SFINAE通过这对于标签中所述的c ++ 03不起作用。
template <typename Ret = TypeToReturn>
typename boost::enable_if<boost::is_integral<Ret>,Ret >::type
operator()(int& someParameterNotImportant) const
或者使用虚拟变量并使运算符因参数而不是返回值而不同。 但仍然保持模板。 这适用于c ++ 03
template<typename T>
TypeToReturn operator()(T& someParameterNotImportant, typename boost::enable_if<boost::is_integral<TypeToReturn>,T >::type* = 0) const
您也可以在此处添加对T为int的检查以发出编译时错误(如果不是)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.