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

时间:2019-02-05 15:12:15

标签: c++ c++11 templates

我读到有关Pillow==5.4.1的信息:

  

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

因此,我试图通过var arr = str.replace(" ", "").split(","); var uniqueArray = arr.filter((v, i, arr) => arr.indexOf(v) === i); 重载类ctor(如下所示),但我收到错误消息,说std::enable_if不能用于禁用声明,而当我使用{{1} }:

enable_if

因此可以使用enable_if使ctor超载。

2 个答案:

答案 0 :(得分:3)

问题是当实例化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 int\n";
}

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

LIVE

答案 1 :(得分:1)

您这里似乎不需要enable_if,只需一个常规构造函数即可:

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

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

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