c++ - 如果 T 不是整数,如何禁用非空 std::set 作为函数参数?

标签 c++ c++14

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_ifSFINAE您可以编写函数的两个重载。一个采用整数的 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/

相关文章:

c++ - 在 map 中使用 unique_ptr 时 std::pair 中的已删除函数

Python C API : Assigning PyObjects to a dictionary causes memory leak

c++ - 如何检查操作系统至少是 Windows XP SP3?

c++ - 模板中的数组和指针

c++ - 使用变体类型列表调用 std::function

c++ - 为什么要用 make_unique 调用来初始化 unique_ptr?

c++ - lambda 体内有这个吗?

c++ - 如何在C++中并行执行系统命令

c++ - 如何在 C++ 中返回 unique_ptr 列表?

c++ - 重载 operator->() 以更改被调用函数的返回值