如何使用 SFINAE 停用我的 `Pow(T)` 的非整数版本?

How to deactivate non-integral versions of my `Pow(T)` using SFINAE?

我被要求使用 SFiNAE 来拒绝我的 Pow(T) 模板函数的非整数版本。因此,如果推导的类型是整数,则 return argument * argument 否则什么也不做,只是通知该版本已被 SFINAE 拒绝。

这是我的尝试:

template<typename T>
auto Pow(T x)->std::enable_if_t<std::is_integral<T>::value>
{
    return x * x;
}

void Pow(...)
{
    std::cout << "rejected by SFiNAE" << std::endl;
}


int main() 
{
    auto ret = Pow(5); // error here:  'ret': variable cannot have the type 'void'
    cout << typeid(Pow(5)).name() << endl; // void
}

您需要提供第二个参数给std::enable_if:

template<typename T>
auto Pow(T x)->std::enable_if_t<std::is_integral<T>::value, decltype(x * x)>
{
    return x * x;
}