std::enable_if的使用问题

问题如下:

class LaNum
{
public:
    /*
    用这里面的代码替换下面的模板函数,就不会报错
    template
    LaNum(T x)
    {

    }
    */
    template<class T>
    LaNum(typename std::enable_if<true,T>::type x)
    {
        
    }
};

LaNum p(1);  //这里会报错

这是为什么?

因为typename std::enable_if<true,T>::type是一个non-deduced context,也就是说编译器不会对模板参数T进行类型推断。要解释的话就是T和type可以不相同,从LaNum p(1)只可能推断出type是int,但是不能推断出T的类型也是int。只是std::enable_if的实现中T和type恰好相同,而编译器不会只考虑特例。

所以必须有其他参数用于推断T的类型。

对于重载的函数,如果能够找到合适的就会替换,如果第一个不合适并不会报错,而会使用下一个替换直到最后一个,如果都不满足要求,那么才会报错。出现二义性的话也会报错。

//判断类型
template <typename _Tp>
struct Smart_pointer : public false_type {};

template <typename _Tp>
struct Smart_pointer<std::weak_ptr<_Tp>> : public true_type {};

template <typename _Tp>
struct Smart_pointer<std::shared_ptr<_Tp>> : public true_type {};

template <typename _Tp>
struct is_smart_pointer : public Smart_pointer<typename std::remove_cv<_Tp>::type>{};

template <typename _Tp>
typename enable_if<is_smart_pointer<_Tp>::value,void>::type check(_Tp p){
    std::cout << "is smart pointer" << std::endl;
}
template <typename _Tp>
typename enable_if<!is_smart_pointer<_Tp>::value,void>::type check(_Tp p){
    std::cout << "not smart pointer" << std::endl;
}
void test_enable_if(){
    int *p = new int(3);
    std::shared_ptr<int> sp = std::make_shared<int>(3);
    check(sp);
    check(p);
    delete p;
}

关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:std::enable_if的用法
同时,你还可以查看手册:c++-enable_if<> 中的内容