加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何将enable_if用于互斥的非成员函数模板?

发布时间:2020-12-16 03:19:43 所属栏目:百科 来源:网络整理
导读:我正在尝试编写非成员运算符函数模板,如: #include utilitytemplate typename T,unsigned L class MyType;template typename T,typename U,unsigned L auto operator ==( MyTypeT,L const l,MyTypeU,L const r ) - decltype( std::declvalT() == std::declv
我正在尝试编写非成员运算符函数模板,如:
#include <utility>

template < typename T,unsigned L >
class MyType;

template < typename T,typename U,unsigned L >
auto  operator ==( MyType<T,L> const &l,MyType<U,L> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

但是当我尝试处理l和r有不同的长度时:

template < typename T,unsigned Lt,unsigned Lu,class Enable = typename std::enable_if<(Lt < Lu)>::type >
auto  operator ==( MyType<T,Lt> const &l,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

template < typename T,class Enable = typename std::enable_if<(Lt > Lu)>::type >
auto  operator ==( MyType<T,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

我得到歧义错误.我尝试过类似的东西:

template < typename T,bool B = (Lt < Lu),class Enable = typename std::enable_if<B>::type >
auto  operator ==( MyType<T,bool B = (Lt > Lu),Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

我已经读过(这里是S.O.)为成员函数模板解决这样的问题. (有时,受访者将成员函数更改为成员函数模板以启用此功能.)但错误不会因我而改变.我是否必须切换到将enable_if放入返回类型?

哦,当无法比较两种元素类型时,返回类型表达式应该排除此运算符.它真的有效吗?是否兼容将enable_if放在那里?

解决方法

有趣的是,certain fellow here on SO在不久前写了一篇博文,展示了一种很好的C 11风格的SFINAE技术,它可以轻松实现重载功能.技术和解释提供于 here.

简而言之,您的代码会失败,因为在第一次解析时和解析非依赖声明时,两个模板都是完全相同的类型.与默认函数参数一样,默认模板参数仅在实际调用函数时被替换.这是两个模板在声明时对编译器的看法:

template<class T,class U,class Enable>
auto operator==(MyType<T,Lt> const& l,Lu> const& r);

以下代码应该实现您想要的:

namespace detail{
enum class enabler{};
}

template<bool B,class T = detail::enabler>
using EnableIf = typename std::enable_if<B,T>::type;

template < typename T,EnableIf<(Lt < Lu)>...>
auto  operator ==( MyType<T,EnableIf<(Lt > Lu)>...>
auto  operator ==( MyType<T,Lu> const &r )
 -> decltype( std::declval<T>() == std::declval<U>() )
{ /*...*/ }

然而,一个问题仍然是……如果Lt == Lu会怎么样?在这种情况下,过载都不可行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读