如果t不是不可或缺的,则如何禁用非空std ::设置为函数参数

How to disable non-empty std::set as a function parameter if T is not integral?

本文关键字:std 设置 参数 函数 何禁用 不可或缺 如果      更新时间:2023-10-16
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