如何使用 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;
}
我被要求使用 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;
}