我可以用 std::enable_if 摆脱模板专业化吗?

Can I get rid of template specialisation with std::enable_if?

本文关键字:专业化 if std enable 我可以      更新时间:2023-10-16

我读到std::enable_if

基于类型任意属性的函数重载

所以我试图通过 enable_if 重载类 ctors(如下所示(,但我收到错误,说enable_if不能用于禁用声明,当我使用 std::enable_if 时,两行都这样做:

#include <iostream>
#include <type_traits>
#include <typeinfo>

template <typename T>
class cls
{
public:
    cls (T a, typename std::enable_if< std::is_same<T, int>::value >::type  * Dummy = 0)
    {
        std::cout << "Ctor for intn";
    }
    cls (T a, typename std::enable_if< std::is_same<T, char>::value >::type  * Dummy = 0)
    {
        std::cout << "Ctor for charn";
    }
};
int main()
{
    cls a(10);
    cls b('x');
    return 0;
}

那么是否可以使用 enbale_if 来重载 ctors .

问题是,例如,当您实例化cls<int>时,您总是会从第二个构造函数覆盖中获得失败的要求,即 std::enable_if< std::is_same<T, char>::value >::typeTint.cls<char>也是如此.

你可以使构造函数模板使SFINAE生效;这将从重载集中摆脱模板专用化,并且不会导致编译错误。

template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, int>::value >::type  * Dummy = 0)
{
    std::cout << "Ctor for intn";
}
template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, char>::value >::type  * Dummy = 0)
{
    std::cout << "Ctor for charn";
}

你在这里似乎不需要enable_if,只需要一个常规的构造函数:

cls(T a) { std::cout << "Ctor for Tn"; }

要禁用模板类专用化,请不要提供其定义:

template<> class cls<void>; // disabled specialization.