template< typename T >
T getNumber(const std::set<T>& setNumbers = std::set<T>())
{
T val;
while(true)
{
std::cin >> val; // ignore sanity checking
if (!setNumbers.empty())
{
if (setNumbers.count(val) == 1)
break;
}
else
break;
}
return val;
}
问题>鉴于上述功能,我想添加以下限制,但不知道实现该功能的最佳方法是什么
1>如果T
是积分( std::integral<T>::value == true
),那么 setNumbers
可以由用户设置,默认值为空集。
2> 如果T
不是整数,那么函数getNumber
不允许任何输入参数。
谢谢
最佳答案
使用 std::enable_if
和 SFINAE您可以编写函数的两个重载。一个采用整数的 T
,另一个采用非整数的 T
。看起来像
// for integers
template <typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
T getNumber(const std::set<T>& setNumbers = std::set<T>())
// for non integers
template <typename T, std::enable_if_t<!std::is_integral<T>::value, bool> = true>
T getNumber()
关于c++ - 如果 T 不是整数,如何禁用非空 std::set 作为函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57261515/