c++ - boost::enable_if 在成员函数上,重载返回类型
问题描述
我希望能够用来boost::enable_if
关闭/打开某些方法。
对于我想要返回的整数类型对于我想要返回TypeToReturn
的operator()
其他类型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 将允许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>());
}
};
推荐阅读
- python - 改变 numpy 数组中一致值的比例
- c# - 制作自定义电话协议 windows 10
- sql - 使用 JOOQ java 创建 Athena 表
- wpf - 如何在没有图像的情况下在 WPF 中制作具有透明背景和模糊效果的堆栈面板?
- java - Netty:如何捕获“java.io.IOException:对等连接重置”
- python - Python VLC - 下一个曲目
- java - 获取满足Java条件的下一个日期
- python - PyGame 没有响应,有什么提示吗?
- docker - 在 Windows 10 中使用 docker-desktop 时,CronJob 在容器内失败
- google-sheets - 行消失在复选框单击 GoogleAppscripts