如果t不是不可或缺的,则如何禁用非空std ::设置为函数参数
How to disable non-empty std::set as a function parameter if T is not integral?
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()
我认为只有一个功能没有合理的方法。
但是,如果您使用两个过载(带有0和1个参数(,这并不难:
template <typename T>
T getNumber()
{
// ...
}
template <typename T, std::enable_if_t<std::is_integral<T>::value> * = nullptr>
T getNumber(const std::set<T> &setNumbers)
{
// ...
}
如果您不需要Sfinae,也可以使用static_assert
。
相关文章:
- std::设置自定义比较器
- std::p 设置或多组的修订问题
- std::设置大小时,vector的性能较低
- std::设置构造函数签名混淆
- 如果t不是不可或缺的,则如何禁用非空std ::设置为函数参数
- STD ::设置带有字符串键和潜在效率损失
- STD ::设置比较器,该比较器指的是外部值
- 用自定义比较器设置操作STD ::设置操作
- 为什么将指针指向std ::设置的提取节点是未定义的行为
- C++std::设置唯一性覆盖
- 在std ::设置中存储一个指针的指针是安全的吗?
- std::设置擦除复杂性异常
- STD ::设置以存储其元素V.S.std :: vector
- std::设置包含对与自定义比较器
- Is STD::设置我应该使用什么来将对象组织到层次结构中
- C++std::从std::deque复制到std:;设置
- 使用函数指针自定义std::设置比较器
- Std::设置快与慢,是怎么回事
- std::设置唯一指针
- std::设置.自定义集合