c – SFINAE启用非模板成员函数

前端之家收集整理的这篇文章主要介绍了c – SFINAE启用非模板成员函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这可能是一个重复,但我找不到一个OP明显有我遇到的问题.
我有一个类,如果类模板参数不是无符号类型,我试图仅启用运算符.
#include <type_traits>

template<class T>
struct A {
    typename std::enable_if<!std::is_unsigned<T>::value,A>::type operator-() {return {};}
};

int main() {
    A<unsigned> a=a;
}

不幸的是,只要我用无符号类型实例化它就会产生编译错误,如图所示.

main.cpp:5:29: error: no type named 'type' in 'std::enable_if<false,A<unsigned int> >'; 'enable_if' cannot be used to disable this declaration
    typename std::enable_if<!std::is_unsigned<T>::value,A>::type operator-() {return {};}
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:9:17: note: in instantiation of template class 'A<unsigned int>' requested here
    A<unsigned> a=a;
                ^

好吧,我可以清楚地看到enable_if在这里不起作用.一个模糊的类似问题提到我可以使用继承和模板专门化来解决这个问题,但是……真的没有更好的方法吗?

解决方法

我曾经遇到过同样的问题.事实证明,由于默认模板参数不依赖于函数模板中的模板参数,因此无法进行替换失败.您必须将模板参数默认为封闭模板类型,如下所示:
template<typename U = T,class = typename std::enable_if<!std::is_unsigned<U>::value,U>::type>
A operator-() { return {}; }

猜你在找的C&C++相关文章